2010-08-29 12 views
13

Dovrei scrivere una funzione per ottenere alcune informazioni sul sistema (l'informazione più importante è l'architettura). Ho trovato la funzione uname che può essere utilizzata incluso sys/utsname.h. Beh, anche se ho cercato su Google e ho letto la documentazione, non ho trovato alcun esempio della funzione e non capisco come usare uname. Qualcuno può spiegarmi come usarlo? sarebbe bello poter scrivere anche un esempio. Grazie in anticipo.C come utilizzare la funzione uname

+0

Quando dici piattaforma, cosa intendi? x86 vs x64? Linux vs BSD? AMD vs Intel? –

+0

scusate non l'ho specificato, intendo per istance i686, x86, x64 ... –

risposta

6

La funzione uname() accetta un puntatore alla struttura utsname che memorizzerà il risultato come input. Pertanto, è sufficiente creare un'istanza temporanea utsname, passarne l'indirizzo su uname e leggere il contenuto di questa struttura dopo che la funzione ha avuto esito positivo.

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

Innanzitutto, includono l'intestazione:

#include <sys/utsname.h> 

Poi, definire una struttura utsname:

struct utsname unameData; 

Quindi chiamare uname() con un puntatore alla struttura:

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

Dopo questo, la struttura wil l contengono le informazioni che si desidera:

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

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

9

Dalla documentazione, sembra che usereste in questo modo:

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 esempio completamente funzionante vale più di mille parole . ;-)

#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

Dovrebbe usare 'perror' in caso di errore. Non è necessario gestire il 'EFAULT' specialmente (non succederà nel tuo codice, dato che' buffer' è un indirizzo valido di una variabile locale) –

+0

Grazie Basile. In effetti 'perror' è meglio di' switch (errno) 'e ho modificato il post per riflettere questo. Il codice gestiva esplicitamente "EFAULT" perché lo scrivevo pensando all'insegnamento, ma in realtà questo particolare esempio non arriverebbe mai. – tupiniquim

Problemi correlati