2010-08-29 19 views
13

Ich sollte eine Funktion schreiben, um einige Informationen über das System zu bekommen (die wichtigste Information ist die Architektur). Ich habe die Funktion uname gefunden, die verwendet werden kann, einschließlich sys/utsname.h. Nun, obwohl ich gegoogelt habe und ich die Dokumentation gelesen habe, konnte ich kein Beispiel für die Funktion finden und ich verstehe nicht, wie man uname verwendet. Jeder kann mir erklären, wie man es benutzt? Es wäre großartig, wenn Sie auch ein Beispiel schreiben könnten. Danke im Voraus.C wie benutze ich die Funktion uname

+0

Wenn Sie Plattform sagen, was meinst du? x86 vs x64? Linux gegen BSD? AMD gegen Intel? –

+0

sorry, ich habe nicht angegeben, ich meine für i686, x86, x64 ... –

Antwort

6

Die Funktion uname() übernimmt einen Zeiger auf die Struktur utsname, die das Ergebnis als Eingabe speichert. Erstellen Sie daher einfach eine temporäre utsname Instanz, übergeben Sie die Adresse davon an uname und lesen Sie den Inhalt dieser Struktur, nachdem die Funktion erfolgreich ausgeführt wurde.

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

Zunächst umfassen die Header:

#include <sys/utsname.h> 

Dann definieren eine utsname Struktur:

struct utsname unameData; 

Dann rufen uname() mit einem Zeiger auf die Struktur:

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

Danach wird die Struktur wil l enthalten Informationen, die Sie wollen:

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

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

9

Aus der Dokumentation, es sieht aus wie Sie es wie so verwenden würde:

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

Ein voll funktionsfähiges Beispiel ist mehr als tausend Worte . ;-)

#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

Sollte "perror" auf Fehler verwenden. Es ist nicht nötig, das 'EFAULT' zu behandeln (es wird nicht in Ihrem Code passieren, da' buffer' eine gültige Adresse einer lokalen Variablen ist) –

+0

Danke Basile. In der Tat ist 'perror' besser als' switch (errno) 'und ich habe den Beitrag bearbeitet, um das zu reflektieren. Der Code behandelte explizit 'EFAULT', weil ich es mit dem Gedanken an die Lehre geschrieben habe, aber in der Tat würde dieses spezielle Beispiel niemals dorthin gelangen. – tupiniquim