uname(2) obtiene el nombre e información del núcleo actual

SINOPSIS

#include <sys/utsname.h>

int uname(struct utsname *buf);

DESCRIPCIÓN

uname devuelve información del sistema en la estructura apuntada por buf. La estructura utsname se define en <sys/utsname.h>:
struct utsname {
char sysname[];
char nodename[];
char release[];
char version[];
char machine[];
#ifdef _GNU_SOURCE
char domainname[];
#endif
};
La longitud de los vectores de la estructura utsname es indefinida; los campos terminan en NUL.

VALOR DEVUELTO

En caso de éxito, se devuelve cero. En caso de error, se devuelve -1 y se establece el errno apropiado.

ERRORES

EFAULT
buf no es válido.

CONFORME A

SVr4, SVID, POSIX, X/OPEN. No hay ninguna llamada uname en BSD 4.3.

El miembro domainname (el nombre de dominio NIS o YP) es una extensión de GNU.

OBSERVACIONES

Esta es una llamada al sistema, y el sistema operativo conoce presumiblemente su nombre, revisión y versión. También sabe sobre qué hardware se ejecuta. Por tanto, cuatro de los campos de la estructura son relevantes. Por otra parte, el campo nodename carece de importancia: da el nombre de la máquina actual en alguna red indefinida, pero normalmente las máquinas se encuentran en más de una red y tienen muchos nombres. Además, el núcleo no tiene manera de conocer estas situaciones, por lo que hay que decirle cómo actuar en este caso. Lo mismo vale para el campo adicional domainname.

Para este propósito Linux utiliza las llamadas al sistema sethostname(2) y setdomainname(2). Observe que no hay ningún estándar que diga que el nombre de host establecido por sethostname(2) sea la misma cadena que contiene el campo nodename de la estructura devuelta por uname (de hecho, algunos sistemas permiten un nombre de host de 256 bytes y un nodename de 8 bytes), pero ésto es cierto en Linux. Lo mismo vale para setdomainname(2) y el campo domainname.

La longitud de los campos en la estructura varía. Algunos sistemas operativos o bibliotecas usan valores fijos como 9, 33, 65 o 257. Otros sistemas usan SYS_NMLN o _SYS_NMLN o UTSLEN o _UTSNAME_LENGTH. Claramente, es una mala idea usar cualquiera de estas constantes - tan sólo utilice sizeof(...). A menudo se elige 257 con el fin de tener espacio para un nombre de host en internet.

Ha habido tres llamadas al sistema uname() en Linux. La primera usaba longitud 9, la segunda usaba 65, la tercera también usa 65 pero añade el campo domainname.

Parte de la información de utsname también puede ser accedida via sysctl y via /proc/sys/kernel/{ostype, hostname, osrelease, version, domainname}.