Функция sysconf()
выдает такой тип системной информации, которая для одного и того же исполняемого файла в различных системах может отличаться и которую невозможно узнать во время компиляции.
#include <unistd.h>
long sysconf (int);
Целочисленный аргумент в sysconf()
— это один из наборов макросов с префиксом _SC_
. Ниже перечислены макросы, которые используются чаще всего.
_SC_CLK_TCK |
Возвращает количество тактов в секунду внутренних часов ядра, различаемое программами. Следует отметить, что ядро может содержать одни или больше часов, работающих на более высокой частоте. _SC_CLK_TCK обеспечивает подсчет тактов, которые используются для получения информации из ядра, и этот макрос не является индикатором времени ожидания системы. |
_SC_STREAM_MAX |
Возвращает максимальное количество стандартных потоков ввода-вывода С, которые могут быть одновременно открыты в системе. |
_SC_ARG_MAX |
Возвращает максимальную длину аргумента командной строки и переменных окружения в байтах, которые используются любой из функций exec() . Если это ограничение превышено, exec() вернет ошибку Е2ВIG . |
_SC_OPEN_MAX |
Возвращает максимальное количество файлов, которые одновременно могут быть открыты процессом; это то же самое, что и программное ограничение RLIMIT_NOFILE , которое может быть запрошено функцией getrlimit() и установлено функцией setrlimit() . Это единственное значение sysconf() , которое может изменяться во время выполнения программы; при вызове setrlimit() для изменения ограничения RLIMIT_NOFILE . _SC_OPEN_MAX также подчиняется новому программному ограничению. |
_SC_PAGESIZE или _SC_PAGE_SIZE |
Возвращает размер одной страницы в байтах. В системах, которые могут поддерживать разные размеры страниц, возвращается размер одной обычной страницы, для которой выделено определенное количество памяти и которая считается естественным размером страниц для конкретной системы. |
_SC_LINE_MAX |
Возвращает максимальную длину в байтах входной строки, обрабатываемой текстовыми утилитами, включая завершающий символ новой строки. Следует отметить, что во многих утилитах GNU, используемых в Linux-системах, фактически нет жестко закодированной максимальной длины строки, потому могут применяться входные строки произвольной длины. Однако переносимая программа не должна вызывать текстовые утилиты для строк, длина которых превышает _SC_LINE_MAX ; во многих Unix-системах утилиты работают с фиксированным максимальным размером строки, и его превышение может привести к неопределенным результатам. |
_SC_NGROUPS_MAX |
Возвращает количество дополнительных групп (см. главу 10), которые может иметь процесс. |
6.2.3. Поиск и настройка базовой системной информации
Существует несколько порций полезной информации о системе, которая может понадобиться программе. Например, название и версия операционной системы могут служить для определения функциональности, предлагаемой системными программами.
Системный вызов uname()
позволяет программе обнаружить информацию времени ее выполнения.
#include <sys/utsname.h>
int uname(struct utsname* unameBuf);
В случае ошибки функция возвращает ненулевое значение, что происходит только в ситуациях, когда передается недопустимый указатель unameBuf
. При нормальном завершении структура, на которую он указывает, заполняется строками, завершаемыми NULL
, которые описывают текущую систему. В табл. 6.1 представлены члены структуры utsname
.
Таблица 6.1. Члены структуры utsname
Член | Описание |
---|---|
sysname |
Название операционной системы (в данном случае Linux ). |
release |
Номер версии выполняющегося ядра. Это полная версия вроде 2.6.2 . Номер может быть легко изменен тем, кто выполнял сборку ядра, и вполне возможно, что цифр будет больше трех. Во многих версиях можно встретить дополнительную цифру для описания примененных исправлений, например, 2.4.17-23 . |
version |
Под Linux здесь содержится временная метка, описывающая время, когда собиралось ядро. |
machine |
Короткая строка, указывающая тип микропроцессора, на котором работает операционная система. Для Pentium Pro или более мощных она может быть i686 , для процессоров класса Alpha — alpha , а для 64-разрядных процессоров PowerPC — ррс64 . |
nodename |
Имя хоста машины, которое обычно является первичным именем хоста в Internet. |
domainname |
Домен NIS (или YP), которому принадлежит машина. |
Член nodename
(имя узла) часто называется системным именем хоста (то, что отображает команда hostname
), однако его не следует путать с именем Internet-хоста. Несмотря на то что во многих системах эти члены не различаются, путать их не стоит. В системе с множеством Internet-адресов есть множество имен Internet-хостов, но только одно имя узла, поэтому эти имена не являются эквивалентными.
Более распространенная ситуация связана с домашними компьютерами, которые используют Internet-каналы широкополосной связи. Обычно их имя хоста в Internet выглядит вроде host127-56.raleigh.myisp.com
, а имена Internet-хостов меняются каждый раз при отключении на длительное время от модема[6]. Владельцы этих машин дают своим компьютерам имя узла, которое им больше нравится, например, loren
или eleanor
, что совершенно не относится к адресам Internet. При наличии множества машин, работающих на одном домашнем шлюзе, все они будут разделять один Internet-адрес (и одно имя Internet-хоста), но могут иметь имена вроде Linux.mynetwork.org
и freebsd.mynetwork.org
, которые все еще не являются именами Internet-хоста. В связи со всеми вышеперечисленными причинами, предполагать, что имя системного узла является допустимым именем Internet-хоста для машины не верно.
6
Большинство, но не все, поставщики услуг доступа в Internet назначают динамические IP-адреса, а не статические.