uname - システムコールの説明 - Linux コマンド集 一覧表
名前
uname - 現在稼働中のカーネルについての名前と情報を得る
書式
#include <sys/utsname.h>
int uname(struct utsname *
buf
);
説明
uname
()は
buf
で指される構造体にシステム情報を返す。
utsname
構造体は
<sys/utsname.h>
で以下のように定義されている。
struct utsname {
char sysname[]; char nodename[]; char release[]; char version[]; char machine[];
#ifdef _GNU_SOURCE
char domainname[];
#endif };
struct utsname にある配列の長さは指定されていない。 フィールドは NULL バイト ('\0') で終端される。
返り値
成功した場合 0 が返る。失敗した場合 -1 が返り、 errno がエラーの内容に従って設定される。
エラー
- EFAULT
- buf が有効でない。
準拠
SVr4, POSIX.1-2001. 4.3BSD には uname ()コールがない。
domainname メンバー (NIS または YP ドメイン名) は GNU の拡張である。
注意
これはシステムコールであり、OS は名前・リリース・バージョンなどを たぶん分かっているだろう。 さらにそれが稼働しているハードウェアも分かっているだろう。 よって構造体の 4 つのフィールドには意味がある。 一方、nodename フィールドには意味がない: このフィールドは現在のマシンの (定義されていない) どこかのネットワークにおける名前を与えるが、 通常マシンは複数のネットワークに属し、複数の名前を持つ。 さらに、カーネルはこのような情報を知る術を持たないので、 ここでの答えは前もって教えてやらなければならない。 これは追加フィールドである domainname についても同様である。
このため 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 が選ばれることが多い。
Linux システムコール uname () はこれまでに 3 種類存在した。 最初の uname () は長さ 9 を使っていた。 次のものは長さ 65 を使っていた。 現在でも長さ 65 を使っているが、domainname フィールドが追加された。
utsname の情報は、 sysctl ()や /proc/sys/kernel/ { ostype , hostname , osrelease , version , domainname }を使ってアクセスすることもできる。