int uname(struct utsname *buf);
struct utsname { char sysname[]; char nodename[]; char release[]; char version[]; char machine[]; #ifdef _GNU_SOURCE char domainname[]; #endif };struct utsname にある配列の長さは指定されていない。 フィールドは NULL バイト ('\0') で終端される。
domainname メンバー (NIS または YP ドメイン名) は GNU の拡張である。
このため Linux ではシステムコール sethostname(2) と setdomainname(2) が使われる。 「sethostname(2) で設定されるホスト名は、 uname() で返される構造体の nodename フィールドと同じ文字列である」 と規定している標準規格はない (実際、256 バイトのホスト名と 8 バイトのノード名を許可しているシステムもある)。 しかし、Linux では同じ文字列が返される。 setdomainname(2) と domainname フィールドについても同じことが成り立つ。
構造体のフィールドの長さはさまざまである。 OS やライブラリの中には、 ハードコードされた 9, 33, 65, 257 などの値を使っているものもある。 また SYS_NMLN, _SYS_NMLN, UTSLEN, _UTSNAME_LENGTH などを 使っているシステムもある。 はっきり言って、これらの定数を使うのは悪い考え方であり、 sizeof(...) を使うべきである。 インターネットホスト名で使う領域を持たせるために、 257 が選ばれることが多い。
utsname の情報は、 sysctl() や /proc/sys/kernel/{ostype, hostname, osrelease, version, domainname} を使ってアクセスすることもできる。
時間の経過とともに、 utsuname 構造体のサイズが大きくなり、この影響で uname() には 3つのバージョンが存在する: sys_olduname() (スロットは __NR_oldolduname)、 sys_uname() (スロットは __NR_olduname)、 sys_newuname() (スロットは __NR_uname)。 最初のものはすべてのフィールドが長さ 9 を使っていた。 次のものは長さ 65 を使っていた。 三番目のものも長さ 65 を使っているが、 domainname フィールドが追加されている。 glibc の uname() ラッパー関数は、これらの詳細をアプリケーションから隠蔽し、 カーネルが提供しているシステムコールのうち最新のバージョンを起動する。