Длина массивов в
struct utsname
не указана; все поля оканчиваются символом NUL.
ВОЗВРАЩАЕМЫЕ ЗНАЧЕНИЯ
При удачном завершении работы функции возвращается 0.
При ошибке возвращается -1, а переменной
errno
присваивается номер ошибки.
НАЙДЕННЫЕ ОШИБКИ
EFAULT
Неверное значение
buf.
СООТВЕТСТВИЕ СТАНДАРТАМ
SVr4, SVID, POSIX, X/OPEN.
В BSD 4.3 вызов
uname
отсутствует.
Поле
domainname
(домен NIS или YP) является расширением, предложенным GNU.
ЗАМЕЧАНИЯ
Это системный вызов, и операционная система, предположительно, знает свое имя,
номер выпуска и версию. Она также знает, на каком аппаратном обеспечении она работает.
Таким образом, четыре поля структуры несут полезную информацию. С другой стороны, поле
nodename ее не несет: оно указывает имя машины в некой неопределенной сети,
но обычно машины находятся в более чем одной сети и имеют несколько имен.
Более того, ядро не может каким-либо образом получить информацию о таких вещах,
поэтому ему необходимо сообщить что же возвращать в этом поле. То же относится и
к дополнительному полю domainname.
С этой целью в Linux используются системные вызовы
sethostname(2)
и
setdomainname(2).
Обратите внимание, что хотя не существует стандарта, который бы указывал,
что имя машины, установленное
sethostname(2),
является той же строкой, что возвращается в поле nodename при вызове
uname,
но для Linux это именно так (в действительности некоторые системы позволяют
256-символьное hostname и 8-символьное nodename). То же относится и к
setdomainname(2)
и полю domainname.
Длина полей в структуре может быть различна. Некоторые операционные системы
или библиотеки используют жестко прошитые значения 9, 33, 65 или 257. Другие
используют константы SYS_NMLN, _SYS_NMLN, UTSLEN или _UTSNAME_LENGTH. Несомненно,
идея использовать эти константы не очень хороша - можно просто использовать
sizeof(...).
Часто выбирается 257 для того, чтобы имелось достаточно места для хранения
имени машины в сети internet.
В Linux имелось три системных вызова uname(). Первый использовал
длину 9, второй - 65, а третий также использовал 65, но добавлял поле
domainname.
Часть информации из структуры utsname может быть получена также через
sysctl
и через
/proc/sys/kernel/{ostype,
hostname,
osrelease,
version,
domainname}.