int uname(struct utsname *buf);
struct utsname { char sysname[]; char nodename[]; char release[]; char version[]; char machine[]; #ifdef _GNU_SOURCE char domainname[]; #endif };La lunghezza degli array in una struttura utsname non è specificata; i campi sono terminati con un byte nullo ('\0').
Il membro domainname (il nome di dominio NIS o YP) è un'estensione GNU.
A questo scopo Linux usa le chiamate di sistema sethostname(2) e setdomainname(2). Notare che non c'è alcuno standard che dice che il nome host impostato da sethostname(2) è la stessa stringa del campo nodename della struttura restituita da uname() (in verità, alcuni sistemi permettono un nome host di 256 byte e un nome nodo di 8 byte), ma ciò è vero in Linux. Lo stesso vale per setdomainname(2) e per il campo domainname.
La lunghezza dei campi nella struttura varia. Alcuni sistemi operativi o librerie usano un valore prefissato 9 o 33 o 65 o 257. Altri sistemi usano SYS_NMLN o _SYS_NMLN o UTSLEN o _UTSNAME_LENGTH. E' chiaramente una pessima idea usare una qualunque di queste costanti; si usi solo sizeof(...). Spesso è scelto 257 per avere spazio per un nome di host internet.
Parte dell'informazione utsname è anche accessibile attraverso sysctl(2) e attraverso /proc/sys/kernel/{ostype, hostname, osrelease, version, domainname}.
Col tempo, aumenti nella dimensione della struttura utsuname hanno portato a tre versioni successive di uname(): sys_olduname() (slot __NR_oldolduname), sys_uname() (slot __NR_olduname), e sys_newuname() (slot __NR_uname). La prima usava la lunghezza 9 per tutti i campi; la seconda usava 65; anche la terza usava 65, aggiungendo però il campo domainname. La funzione wrapper di glibc, uname(), nasconde questi dettagli alle applicazioni, invocando la versione più recente della chiamata di sistema fornita dal kernel.