2010-08-29 16 views
13

Je devrais écrire une fonction pour obtenir des informations sur le système (l'information la plus importante est l'architecture). J'ai trouvé la fonction uname qui peut être utilisé, y compris sys/utsname.h. Eh bien, bien que j'ai googlé et que j'ai lu la documentation, je n'ai trouvé aucun exemple de la fonction et je ne comprends pas comment utiliser uname. N'importe qui peut m'expliquer comment l'utiliser? ce serait génial si vous pouvez écrire un exemple, aussi. Merci d'avance.C comment utiliser la fonction uname

+0

Quand vous dites plateforme, que voulez-vous dire? x86 vs x64? Linux vs BSD? AMD vs Intel? –

+0

désolé je n'ai pas spécifié, je veux dire pour istance i686, x86, x64 ... –

Répondre

6

La fonction uname() prend un pointeur vers la structure utsname qui stockera le résultat en entrée. Par conséquent, il suffit de créer une instance temporaire utsname, de lui transmettre l'adresse uname et de lire le contenu de cette structure après la réussite de la fonction.

struct utsname retval; 
if(uname(&retval) < 0) {  // <---- 
    perror("Failed to uname"); 
    // error handling... 
} else { 
    printf("System name = %s\n", retval.sysname); 
    // print other info.... 
    // see http://www.opengroup.org/onlinepubs/009695399/basedefs/sys/utsname.h.html 
    // for other members... 
} 
24

En premier lieu, comprennent l'en-tête:

#include <sys/utsname.h> 

Ensuite, définir une structure utsname:

struct utsname unameData; 

Ensuite, appelez uname() avec un pointeur vers la struct:

uname(&unameData); // Might check return value here (non-0 = failure) 

Après cela, la structure sera l contiennent les informations que vous souhaitez:

printf("%s", unameData.sysname); 

http://opengroup.org/onlinepubs/007908775/xsh/sysutsname.h.html

9

De la documentation, il semble que vous voulez l'utiliser comme ceci:

struct utsname my_uname; 
if(uname(&my_uname) == -1) 
    printf("uname call failed!"); 
else 
    printf("System name: %s\nNodename:%s\nRelease:%s\nVersion:%s\nMachine:%s\n", 
     my_uname.sysname, my_uname.nodename, my_uname.release,my_uname.version,my_uname.machine); 
10

Un exemple entièrement vaut mille mots . ;-)

#include <stdio.h> 
#include <stdlib.h> 
#include <errno.h> 
#include <sys/utsname.h> 

int main(void) { 

    struct utsname buffer; 

    errno = 0; 
    if (uname(&buffer) != 0) { 
     perror("uname"); 
     exit(EXIT_FAILURE); 
    } 

    printf("system name = %s\n", buffer.sysname); 
    printf("node name = %s\n", buffer.nodename); 
    printf("release  = %s\n", buffer.release); 
    printf("version  = %s\n", buffer.version); 
    printf("machine  = %s\n", buffer.machine); 

    #ifdef _GNU_SOURCE 
     printf("domain name = %s\n", buffer.domainname); 
    #endif 

    return EXIT_SUCCESS; 
} 
+1

Devrait utiliser 'perror' en cas d'échec. Pas besoin de gérer le 'EFAULT' spécialement (cela n'arrivera pas dans votre code, puisque' buffer' est une adresse valide d'une variable locale) –

+0

Thanks Basile. En fait 'perror' est meilleur que' switch (errno) 'et j'ai modifié le post pour le refléter. Le code traitait explicitement 'EFAULT' parce que je l'ai écrit en pensant à l'enseignement, mais en fait cet exemple particulier n'arriverait jamais. – tupiniquim