Программирование в стандарте POSIX

Опрос характеристик хостов и их использование в приложениях

Разбить на страницы
Показывать лекцию целиком

Опрос идентифицирующих данных хостов

Самую общую информацию о характеристиках хоста позволяют получить служебная программа uname

uname [-snrvma]

и одноименная функция (см. листинг 10.1).

#include <sys/utsname.h>
int uname (struct utsname *name);

Функция uname( помещает информацию, идентифицирующую опрашиваемую систему, в структуру типа utsname, которая должна содержать по крайней мере следующие поля.

char sysname [];  /* Имя реализации ОС */
char nodename []; /* Имя хоста как узла */
                  /* коммуникационной сети */
char release [];  /* Номер выпуска ОС */
char version [];  /* Номер версии ОС */
char machine [];  /* Название аппаратной */
                  /* конфигурации */

Размер массивов не специфицируется, оговаривается только, что хранящиеся в них цепочки символов завершаются нулевым байтом.

Аналогичные данные выдает на стандартный вывод служебная программа uname, опции которой соответствуют полям структуры utsname ( -m – выдать название аппаратной конфигурации, -nимя узла, -s, -r и -v – имя реализации ОС, номера выпуска и версии, соответственно). Опция -a предписывает выдавать все; без опций выдается имя реализации.

Результат выполнения команды

uname -a

может выглядеть так, как показано в листинге 10.2. Правда, здесь фигурирует нестандартная составляющая, выдаваемая по опции -p, – тип процессора (в данном случае unknown ).

Linux t94 2.4.18-3 #1 Thu Apr 18 07:37:53
EDT 2002 i686 unknown

Функция gethostname() (см. листинг 10.3) возвращает в массиве name длины namelen   имя хоста. Подходящее значение для namelenHOST_NAME_MAX + 1 (см. следующий раздел).

#include <unistd.h>
int gethostname (char *name, size_t namelen);

Опрос конфигурационных параметров хоста

Значения конфигурационных параметров – важнейшая характеристика хоста, а настройка на конфигурацию целевой системы – обязательный элемент мобильного программирования приложений. Подобная настройка может выполняться статически, средствами условной компиляции, а также динамически, путем опроса значений конфигурационных параметров во время выполнения.

Основная часть статической конфигурационной информации сосредоточена в упоминавшемся ранее заголовочном файле <unistd.h>. Кратко опишем наиболее важные характеристики.

_POSIX_VERSION

Поддерживаемая версия системного интерфейса для языка C стандарта POSIX. Для POSIX-2001 значение этой константы должно равняться 200112L. Предыдущей версии (1996 года) соответствует значение 199506L.

_POSIX2_VERSION

Поддерживаемая версия интерфейса к системным сервисам на уровне командного языка и служебных программ; для реализаций, соответствующих стандарту POSIX-2001, значение этой константы должно равняться 200112L.

В листинге 10.4 показан пример использования значения _POSIX_VERSION для условной компиляции.

#if _POSIX_VERSION >= 200112L
/* Используем новую функцию, применимую к  */
/* большим файлам                          */
off_t fpos = ftello (fp);
#else
/* Либо реализация поддерживает только     */
/* старую версию стандарта POSIX, либо     */
/* константа _POSIX_VERSION вообще не      */
/* определена.                             */
/* Используем старую, традиционную функцию */
/* опроса текущей позиции в файле          */
long fpos = ftell (fp);
#endif

Следующая группа констант описывает поддерживаемые необязательные возможности стандарта POSIX-2001. Значения этих констант могут равняться -1 (необязательная возможность не поддерживается), 0 (в системе присутствуют все необходимые описания, но наличие поддержки нужно опросить во время выполнения) или быть положительными (возможность полностью поддерживается реализацией).

_POSIX_CHOWN_RESTRICTED

Функции chown() и fchown() могут вызываться для смены владельца только процессами, обладающими соответствующими привилегиями.

_POSIX_IPV6

Реализация поддерживает IPv6. Положительное значение этой константы должно равняться 200112L.

_POSIX_JOB_CONTROL

Реализация поддерживает управление заданиями.

_POSIX_NO_TRUNC

Компоненты маршрутных имен, имеющие длину более NAME_MAX, вызывают сообщения об ошибках.

_POSIX_REGEXP

Реализация поддерживает обработку регулярных выражений.

_POSIX_SAVED_IDS

Каждый процесс имеет сохраненный ПДП-идентификатор и сохраненный ПДГ-идентификатор.

_POSIX_SHELL

Реализация поддерживает стандартный командный интерпретатор.

_POSIX_VDISABLE

Значением этой константы должен быть символ, отключающий обработку соответствующего специального управляющего символа терминала, если его (символ _POSIX_VDISABLE ) сделать значением элемента массива c_cc[].

_POSIX2_C_BIND

Реализация поддерживает системный интерфейс для языка C. Значение этой константы должно равняться 200112L.

_POSIX2_CHAR_TERM

Реализация поддерживает по крайней мере один тип терминалов.

_POSIX2_LOCALEDEF

Реализация поддерживает создание языково-культурных сред. Положительное значение должно равняться 200112L.

_POSIX_V6_ILP32_OFF32

Реализация предоставляет среду компиляции C-программ с 32-битными типами int, long, off_t и такими же указателями.

_POSIX_V6_ILP32_OFFBIG

Реализация предоставляет среду компиляции C-программ с 32-битными типами int, long и такими же указателями; размер значений типа off_t составляет не менее 64 бит.

_POSIX_V6_LP64_OFF64

Реализация предоставляет среду компиляции C-программ с 32-битным типом int и 64-битными указателями и типами long и off_t.

_POSIX_V6_LPBIG_OFFBIG

Реализация предоставляет среду компиляции C-программ с не менее чем 32-битными значениями типа int и не менее чем 64-битными указателями и значениями типов long и off_t.

_POSIX_ASYNC_IO

Поддерживается асинхронный ввод/вывод.

_POSIX_PRIO_IO

Поддерживается приоритетный ввод/вывод.

_POSIX_SYNC_IO

Поддерживается синхронизированный ввод/вывод.

Три константы задают номера файловых дескрипторов для стандартных ввода ( STDIN_FILENO со значением 0 ), вывода ( STDOUT_FILENO1 ) и протокола ( STDERR_FILENO2 ). Их нужно не анализировать, а использовать вместо явных числовых значений.

Разного рода лимиты на количество и размеры заданы в заголовочном файле <limits.h>. Стандарт определяет минимально допустимые значения для подобных лимитов, которые поддерживаются реализациями и предоставляются приложениям.

Мобильные приложения не должны полагаться на какие-то конкретные значения лимитов и требовать больше ресурсов, чем предусмотрено минимально допустимыми значениями.

Перечислим наиболее важные из числа лимитирующих конфигурационных констант. В скобках после имени константы указаны имя минимально допустимого значения и само это значение (если, конечно, они определены в стандарте).

ARG_MAX (_POSIX_ARG_MAX = 4096)

Максимально допустимая длина аргумента функций семейства exec*() (включая данные окружения).

ATEXIT_MAX (32)

Максимально допустимое число функций, которые можно зарегистрировать посредством atexit().

CHARCLASS_NAME_MAX 
       (_POSIX2_CHARCLASS_NAME_MAX = 14)

Максимально допустимое число байт в имени класса символов.

CHILD_MAX (_POSIX_CHILD_MAX = 25)

Максимально допустимое число одновременно существующих процессов с одним реальным идентификатором пользователя.

HOST_NAME_MAX (_POSIX_HOST_NAME_MAX = 255)

Максимально допустимая длина имени хоста (без завершающего нулевого байта).

LINE_MAX (_POSIX2_LINE_MAX = 2048)

Максимально допустимое число байт в строке текстового файла.

LOGIN_NAME_MAX (_POSIX_LOGIN_NAME_MAX = 9)

Максимально допустимая длина входного имени (с учетом завершающего нулевого байта). Таким образом, по соображениям мобильности входное имя должно состоять не более чем из восьми байт.

NGROUPS_MAX (_POSIX_NGROUPS_MAX = 8)

Максимально допустимое число дополнительных групп для процесса.

OPEN_MAX (_POSIX_OPEN_MAX = 20)

Максимально допустимое число файлов, одновременно открытых в одном процессе.

PAGESIZE, PAGE_SIZE (1)

Размер страницы оперативной памяти в байтах.

RE_DUP_MAX (_POSIX2_RE_DUP_MAX = 255)

Максимально допустимое число повторных вхождений регулярного выражения при использовании интервальной нотации \{m,n\}.

STREAM_MAX (_POSIX_STREAM_MAX = 8)

Максимально допустимое число потоков, одновременно открытых в одном процессе.

SYMLOOP_MAX (_POSIX_SYMLOOP_MAX = 8)

Максимально допустимое число символьных ссылок, которые могут быть обработаны в случае разрешения маршрутных имен файлов при отсутствии циклов.

TTY_NAME_MAX (_POSIX_TTY_NAME_MAX = 9)

Максимально допустимая длина имени терминального устройства (с учетом завершающего нулевого байта).

TZNAME_MAX (_POSIX_TZNAME_MAX = 6)

Максимально допустимая длина имени часового пояса.

Следующие конфигурационные параметры, строго говоря, относятся не к хосту, а к файловой системе или даже ее части; тем не менее, их естественно рассмотреть наряду с общесистемными характеристиками.

FILESIZEBITS (32)

Минимальное число бит, необходимое для представления размера обычного файла в виде целочисленного значения со знаком.

LINK_MAX (_POSIX_LINK_MAX = 8)

Максимально допустимое число жестких ссылок на файл.

MAX_CANON (_POSIX_MAX_CANON = 255)

Максимально допустимое число байт во входной строке при каноническом вводе с терминала.

MAX_INPUT (_POSIX_MAX_INPUT = 255)

Максимально допустимое число байт во входной терминальной очереди.

NAME_MAX (_POSIX_NAME_MAX = 14)

Максимально допустимая длина простого имени файла (без завершающего нулевого байта).

PATH_MAX (_POSIX_PATH_MAX = 256)

Максимально допустимая длина маршрутного имени файла (с учетом завершающего нулевого байта).

PIPE_BUF (_POSIX_PIPE_BUF = 512)

Максимально допустимое число байт, которое можно неделимым образом записать в канал.

SYMLINK_MAX (_POSIX_SYMLINK_MAX = 255)

Максимально допустимое число байт в символьной ссылке.

Следующие конфигурационные константы определяют границы числовых значений различных типов для целевой конфигурации, которые могут стать предметом проверок в директивах условной компиляции.

CHAR_BIT (8)

Число бит в значении типа char.

CHAR_MAX

Максимальное значение типа char. Совпадает с UCHAR_MAX или SCHAR_MAX.

CHAR_MIN

Минимальное значение типа char ( SCHAR_MIN или 0 ).

INT_MAX (2147483647).

Максимальное значение типа int.

LONG_BIT (32)

Число бит в значении типа long.

LONG_MAX (2147483647)

Максимальное значение типа long.

SCHAR_MAX (127)

Максимальное значение типа signed char.

SHRT_MAX (32767)

Максимальное значение типа short.

SSIZE_MAX (_POSIX_SSIZE_MAX = 32767)

Максимальное значение типа ssize_t.

UCHAR_MAX (255)

Максимальное значение типа unsigned char.

UINT_MAX (4294967295)

Максимальное значение типа unsigned int.

ULONG_MAX (4294967295)

Максимальное значение типа unsigned long.

USHRT_MAX (65535)

Максимальное значение типа unsigned short.

WORD_BIT (16)

Число бит в слове или значении типа int.

INT_MIN (-2147483647)

Минимальное значение типа int.

LONG_MIN (-2147483647)

Минимальное значение типа long.

SCHAR_MIN (-128)

Минимальное значение типа signed char.

SHRT_MIN (-32767)

Минимальное значение типа short.

LLONG_MIN (-9223372036854775807)

Минимальное значение типа long long.

LLONG_MAX (9223372036854775807)

Максимальное значение типа long long.

ULLONG_MAX (18446744073709551615)

Максимальное значение типа unsigned long long.

Некоторые полезные конфигурационные константы определены в заголовочном файле <stdio.h>.

BUFSIZ

Размер буферов ввода/вывода.

L_ctermid

Максимальный размер символьного массива для хранения имени управляющего терминала - результата функции ctermid().

L_tmpnam

Максимальный размер символьного массива для хранения имени временного файла – результата функции tmpnam().

FILENAME_MAX

Максимально допустимое число байт в имени открываемого файла.

TMP_MAX (25)

Максимально допустимое число обращений к функции tmpnam(), при котором гарантируется уникальность генерируемых имен.

Упоминавшаяся ранее служебная программа getconf

getconf [-v спецификация] 
             конфигурационный_параметр
getconf [-v спецификация] 
             конфигурационный_параметр
маршрутное_имя

а также функции sysconf(), confstr(), fpathconf() и pathconf() (см. листинг 10.5) предназначены для опроса значений системных параметров во время выполнения. Первая из перечисленных функций опрашивает лимитирующие конфигурационные параметры, имеющие числовые значения, вторая возвращает конфигурационные цепочки символов, а две последние – конфигурационные значения, относящиеся к файлам.

#include <unistd.h>
long sysconf (int name);
size_t confstr (int name, char *buf, 
                             size_t len);
long fpathconf (int fildes, int name);
long pathconf (const char *path, int name);

Утилита getconf выдает на стандартный вывод значение конфигурационного параметра, которое во второй форме может быть специфичным для файловой системы или даже для файла. В первом приближении можно считать, что по набору опрашиваемых параметров она эквивалентна совокупности функций, представленных в листинге 10.5, только в именах, обслуживаемых функцией confstr(), нужно удалять префикс _CS_.

Опция

-v спецификация

задает опрашиваемую конфигурацию и версию. По умолчанию используется подразумеваемое для данной реализации окружение.

Например, если определен конфигурационный параметр _POSIX_V6_ILP32_OFF32, то команда вида

getconf -v _POSIX_V6_ILP32_OFF32 ...

опрашивает значения, соответствующие 32-битной среде компиляции.

Приведем несколько примеров использования служебной программы getconf. Команда

getconf LINE_MAX
может выдать 2048, а команда
getconf PATH_MAX /tmp

в используемой автором версии ОС Linux выдает 4096.

Обращение со служебной программой getconf требует известной аккуратности. Нужно помнить, что конфигурационный параметр может быть неопределенным, а указанное имя не обслуживаться вообще; в последнем случае на стандартный вывод ничего не выдается. В листинге 10.6 показан фрагмент командного файла, где сделана попытка учесть эти нюансы.

if unm=$(getconf "$@"); then
if [ "$unm" = "undefined" ]; then
echo Значение "$@" не определено
else
echo Значение "$@" равно $unm.
fi
else
echo Ошибка при выполнении getconf
fi

Функция sysconf() опрашивает описанные выше конфигурационные параметры с числовыми значениями, определенные в заголовочных файлах <unistd.h> и <limits.h> ; аргумент name задает имя опрашиваемого параметра.

Функция confstr() возвращает значения для следующих конфигурационных параметров, определенных в заголовочном файле <unistd.h> и заданных аргументом name:

_CS_PATH

Значение переменой окружения PATH, позволяющее найти все стандартные служебные программы.

_CS_POSIX_V6_ILP32_OFF32_CFLAGS

_CS_POSIX_V6_ILP32_OFF32_LDFLAGS

_CS_POSIX_V6_ILP32_OFF32_LIBS

Опции и библиотеки для компиляции и редактирования внешних связей приложений, использующих 32-битную программную модель.

_CS_POSIX_V6_ILP32_OFFBIG_CFLAGS

_CS_POSIX_V6_ILP32_OFFBIG_LDFLAGS

_CS_POSIX_V6_ILP32_OFFBIG_LIBS

_CS_POSIX_V6_LP64_OFF64_CFLAGS

_CS_POSIX_V6_LP64_OFF64_LDFLAGS

_CS_POSIX_V6_LP64_OFF64_LIBS

_CS_POSIX_V6_LPBIG_OFFBIG_CFLAGS

_CS_POSIX_V6_LPBIG_OFFBIG_LDFLAGS

_CS_POSIX_V6_LPBIG_OFFBIG_LIBS

Опции и библиотеки для других программных моделей.

_CS_POSIX_V6_WIDTH_RESTRICTED_ENVS

Список имен поддерживаемых реализацией программных моделей, в которых размеры типов blksize_t, cc_t, mode_t, nfds_t, pid_t, ptrdiff_t, size_t, speed_t, ssize_t, suseconds_t, tcflag_t, useconds_t, wchar_t и wint_t не больше, чем long.

Значение конфигурационного параметра возвращается функцией confstr() в буфере buf длины len (при необходимости значение обрезается). Результатом вызова confstr() является минимальный размер буфера, где можно разместить опрашиваемое значение вместе с завершающим нулевым байтом. Если в качестве len задан нуль, в буфер ничего не помещается, но требуемый размер выдается. В листинге 10.7 показана программа, динамически резервирующая буфер необходимого размера и получающая в нем стандартное значение списка поиска.

#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
int main (void) {
size_t buf_len;
char *buf;
if ((buf_len = confstr (_CS_PATH, 
   (char *) NULL, (size_t) 0)) > 0) {
if ((buf = (char *) malloc (buf_len)) != NULL)
   {
   (void) confstr (_CS_PATH, buf, buf_len);
   printf ("Standard PATH: %s\n", buf);
   }
}
return 0;
}

В результате выполнения этой программы может быть выдано:

Standard PATH: /bin:/usr/bin

Функции fpathconf() и pathconf() служат для опроса текущих значений лимитирующих конфигурационных параметров или наличия необязательных возможностей, ассоциированных с файлами или каталогами, которые могут задаваться открытыми дескрипторами (аргумент fildes функции fpathconf() ) или маршрутными именами (аргумент path функции pathconf() ).

Аргумент name задает имя опрашиваемого параметра. Выше мы уже описывали подобные конфигурационные параметры: FILESIZEBITS, LINK_MAX, MAX_CANON, MAX_INPUT, NAME_MAX, PATH_MAX, PIPE_BUF, SYMLINK_MAX, _POSIX_CHOWN_RESTRICTED, _POSIX_NO_TRUNC, _POSIX_VDISABLE, _POSIX_ASYNC_IO, _POSIX_PRIO_IO, _POSIX_SYNC_IO. Допустимые значения для name получаются путем приписывания к имени параметра префикса _PC_ (например, _PC_PATH_MAX ) или замены префикса _POSIX_ на _PC_ (например, _PC_SYNC_IO ).

Отметим, что во время работы приложения результаты, возвращаемые функциями fpathconf() и pathconf(), могут меняться, поскольку существует вероятность монтирования и/или размонтирования файловых систем, поддерживающих различные необязательные возможности и разные лимиты. В этом смысле результаты функций sysconf() и confstr() более стабильны.

Страницы:

Опрос идентифицирующих данных хостов

Самую общую информацию о характеристиках хоста позволяют получить служебная программа uname

uname [-snrvma]

и одноименная функция (см. листинг 10.1).

#include <sys/utsname.h>
int uname (struct utsname *name);

Функция uname( помещает информацию, идентифицирующую опрашиваемую систему, в структуру типа utsname, которая должна содержать по крайней мере следующие поля.

char sysname [];  /* Имя реализации ОС */
char nodename []; /* Имя хоста как узла */
                  /* коммуникационной сети */
char release [];  /* Номер выпуска ОС */
char version [];  /* Номер версии ОС */
char machine [];  /* Название аппаратной */
                  /* конфигурации */

Размер массивов не специфицируется, оговаривается только, что хранящиеся в них цепочки символов завершаются нулевым байтом.

Аналогичные данные выдает на стандартный вывод служебная программа uname, опции которой соответствуют полям структуры utsname ( -m – выдать название аппаратной конфигурации, -nимя узла, -s, -r и -v – имя реализации ОС, номера выпуска и версии, соответственно). Опция -a предписывает выдавать все; без опций выдается имя реализации.

Результат выполнения команды

uname -a

может выглядеть так, как показано в листинге 10.2. Правда, здесь фигурирует нестандартная составляющая, выдаваемая по опции -p, – тип процессора (в данном случае unknown ).

Linux t94 2.4.18-3 #1 Thu Apr 18 07:37:53
EDT 2002 i686 unknown

Функция gethostname() (см. листинг 10.3) возвращает в массиве name длины namelen   имя хоста. Подходящее значение для namelenHOST_NAME_MAX + 1 (см. следующий раздел).

#include <unistd.h>
int gethostname (char *name, size_t namelen);

Опрос конфигурационных параметров хоста

Значения конфигурационных параметров – важнейшая характеристика хоста, а настройка на конфигурацию целевой системы – обязательный элемент мобильного программирования приложений. Подобная настройка может выполняться статически, средствами условной компиляции, а также динамически, путем опроса значений конфигурационных параметров во время выполнения.

Основная часть статической конфигурационной информации сосредоточена в упоминавшемся ранее заголовочном файле <unistd.h>. Кратко опишем наиболее важные характеристики.

_POSIX_VERSION

Поддерживаемая версия системного интерфейса для языка C стандарта POSIX. Для POSIX-2001 значение этой константы должно равняться 200112L. Предыдущей версии (1996 года) соответствует значение 199506L.

_POSIX2_VERSION

Поддерживаемая версия интерфейса к системным сервисам на уровне командного языка и служебных программ; для реализаций, соответствующих стандарту POSIX-2001, значение этой константы должно равняться 200112L.

В листинге 10.4 показан пример использования значения _POSIX_VERSION для условной компиляции.

#if _POSIX_VERSION >= 200112L
/* Используем новую функцию, применимую к  */
/* большим файлам                          */
off_t fpos = ftello (fp);
#else
/* Либо реализация поддерживает только     */
/* старую версию стандарта POSIX, либо     */
/* константа _POSIX_VERSION вообще не      */
/* определена.                             */
/* Используем старую, традиционную функцию */
/* опроса текущей позиции в файле          */
long fpos = ftell (fp);
#endif

Следующая группа констант описывает поддерживаемые необязательные возможности стандарта POSIX-2001. Значения этих констант могут равняться -1 (необязательная возможность не поддерживается), 0 (в системе присутствуют все необходимые описания, но наличие поддержки нужно опросить во время выполнения) или быть положительными (возможность полностью поддерживается реализацией).

_POSIX_CHOWN_RESTRICTED

Функции chown() и fchown() могут вызываться для смены владельца только процессами, обладающими соответствующими привилегиями.

_POSIX_IPV6

Реализация поддерживает IPv6. Положительное значение этой константы должно равняться 200112L.

_POSIX_JOB_CONTROL

Реализация поддерживает управление заданиями.

_POSIX_NO_TRUNC

Компоненты маршрутных имен, имеющие длину более NAME_MAX, вызывают сообщения об ошибках.

_POSIX_REGEXP

Реализация поддерживает обработку регулярных выражений.

_POSIX_SAVED_IDS

Каждый процесс имеет сохраненный ПДП-идентификатор и сохраненный ПДГ-идентификатор.

_POSIX_SHELL

Реализация поддерживает стандартный командный интерпретатор.

_POSIX_VDISABLE

Значением этой константы должен быть символ, отключающий обработку соответствующего специального управляющего символа терминала, если его (символ _POSIX_VDISABLE ) сделать значением элемента массива c_cc[].

_POSIX2_C_BIND

Реализация поддерживает системный интерфейс для языка C. Значение этой константы должно равняться 200112L.

_POSIX2_CHAR_TERM

Реализация поддерживает по крайней мере один тип терминалов.

_POSIX2_LOCALEDEF

Реализация поддерживает создание языково-культурных сред. Положительное значение должно равняться 200112L.

_POSIX_V6_ILP32_OFF32

Реализация предоставляет среду компиляции C-программ с 32-битными типами int, long, off_t и такими же указателями.

_POSIX_V6_ILP32_OFFBIG

Реализация предоставляет среду компиляции C-программ с 32-битными типами int, long и такими же указателями; размер значений типа off_t составляет не менее 64 бит.

_POSIX_V6_LP64_OFF64

Реализация предоставляет среду компиляции C-программ с 32-битным типом int и 64-битными указателями и типами long и off_t.

_POSIX_V6_LPBIG_OFFBIG

Реализация предоставляет среду компиляции C-программ с не менее чем 32-битными значениями типа int и не менее чем 64-битными указателями и значениями типов long и off_t.

_POSIX_ASYNC_IO

Поддерживается асинхронный ввод/вывод.

_POSIX_PRIO_IO

Поддерживается приоритетный ввод/вывод.

_POSIX_SYNC_IO

Поддерживается синхронизированный ввод/вывод.

Три константы задают номера файловых дескрипторов для стандартных ввода ( STDIN_FILENO со значением 0 ), вывода ( STDOUT_FILENO1 ) и протокола ( STDERR_FILENO2 ). Их нужно не анализировать, а использовать вместо явных числовых значений.

Разного рода лимиты на количество и размеры заданы в заголовочном файле <limits.h>. Стандарт определяет минимально допустимые значения для подобных лимитов, которые поддерживаются реализациями и предоставляются приложениям.

Мобильные приложения не должны полагаться на какие-то конкретные значения лимитов и требовать больше ресурсов, чем предусмотрено минимально допустимыми значениями.

Перечислим наиболее важные из числа лимитирующих конфигурационных констант. В скобках после имени константы указаны имя минимально допустимого значения и само это значение (если, конечно, они определены в стандарте).

ARG_MAX (_POSIX_ARG_MAX = 4096)

Максимально допустимая длина аргумента функций семейства exec*() (включая данные окружения).

ATEXIT_MAX (32)

Максимально допустимое число функций, которые можно зарегистрировать посредством atexit().

CHARCLASS_NAME_MAX 
       (_POSIX2_CHARCLASS_NAME_MAX = 14)

Максимально допустимое число байт в имени класса символов.

CHILD_MAX (_POSIX_CHILD_MAX = 25)

Максимально допустимое число одновременно существующих процессов с одним реальным идентификатором пользователя.

HOST_NAME_MAX (_POSIX_HOST_NAME_MAX = 255)

Максимально допустимая длина имени хоста (без завершающего нулевого байта).

LINE_MAX (_POSIX2_LINE_MAX = 2048)

Максимально допустимое число байт в строке текстового файла.

LOGIN_NAME_MAX (_POSIX_LOGIN_NAME_MAX = 9)

Максимально допустимая длина входного имени (с учетом завершающего нулевого байта). Таким образом, по соображениям мобильности входное имя должно состоять не более чем из восьми байт.

NGROUPS_MAX (_POSIX_NGROUPS_MAX = 8)

Максимально допустимое число дополнительных групп для процесса.

OPEN_MAX (_POSIX_OPEN_MAX = 20)

Максимально допустимое число файлов, одновременно открытых в одном процессе.

PAGESIZE, PAGE_SIZE (1)

Размер страницы оперативной памяти в байтах.

RE_DUP_MAX (_POSIX2_RE_DUP_MAX = 255)

Максимально допустимое число повторных вхождений регулярного выражения при использовании интервальной нотации \{m,n\}.

STREAM_MAX (_POSIX_STREAM_MAX = 8)

Максимально допустимое число потоков, одновременно открытых в одном процессе.

SYMLOOP_MAX (_POSIX_SYMLOOP_MAX = 8)

Максимально допустимое число символьных ссылок, которые могут быть обработаны в случае разрешения маршрутных имен файлов при отсутствии циклов.

TTY_NAME_MAX (_POSIX_TTY_NAME_MAX = 9)

Максимально допустимая длина имени терминального устройства (с учетом завершающего нулевого байта).

TZNAME_MAX (_POSIX_TZNAME_MAX = 6)

Максимально допустимая длина имени часового пояса.

Следующие конфигурационные параметры, строго говоря, относятся не к хосту, а к файловой системе или даже ее части; тем не менее, их естественно рассмотреть наряду с общесистемными характеристиками.

FILESIZEBITS (32)

Минимальное число бит, необходимое для представления размера обычного файла в виде целочисленного значения со знаком.

LINK_MAX (_POSIX_LINK_MAX = 8)

Максимально допустимое число жестких ссылок на файл.

MAX_CANON (_POSIX_MAX_CANON = 255)

Максимально допустимое число байт во входной строке при каноническом вводе с терминала.

MAX_INPUT (_POSIX_MAX_INPUT = 255)

Максимально допустимое число байт во входной терминальной очереди.

NAME_MAX (_POSIX_NAME_MAX = 14)

Максимально допустимая длина простого имени файла (без завершающего нулевого байта).

PATH_MAX (_POSIX_PATH_MAX = 256)

Максимально допустимая длина маршрутного имени файла (с учетом завершающего нулевого байта).

PIPE_BUF (_POSIX_PIPE_BUF = 512)

Максимально допустимое число байт, которое можно неделимым образом записать в канал.

SYMLINK_MAX (_POSIX_SYMLINK_MAX = 255)

Максимально допустимое число байт в символьной ссылке.

Следующие конфигурационные константы определяют границы числовых значений различных типов для целевой конфигурации, которые могут стать предметом проверок в директивах условной компиляции.

CHAR_BIT (8)

Число бит в значении типа char.

CHAR_MAX

Максимальное значение типа char. Совпадает с UCHAR_MAX или SCHAR_MAX.

CHAR_MIN

Минимальное значение типа char ( SCHAR_MIN или 0 ).

INT_MAX (2147483647).

Максимальное значение типа int.

LONG_BIT (32)

Число бит в значении типа long.

LONG_MAX (2147483647)

Максимальное значение типа long.

SCHAR_MAX (127)

Максимальное значение типа signed char.

SHRT_MAX (32767)

Максимальное значение типа short.

SSIZE_MAX (_POSIX_SSIZE_MAX = 32767)

Максимальное значение типа ssize_t.

UCHAR_MAX (255)

Максимальное значение типа unsigned char.

UINT_MAX (4294967295)

Максимальное значение типа unsigned int.

ULONG_MAX (4294967295)

Максимальное значение типа unsigned long.

USHRT_MAX (65535)

Максимальное значение типа unsigned short.

WORD_BIT (16)

Число бит в слове или значении типа int.

INT_MIN (-2147483647)

Минимальное значение типа int.

LONG_MIN (-2147483647)

Минимальное значение типа long.

SCHAR_MIN (-128)

Минимальное значение типа signed char.

SHRT_MIN (-32767)

Минимальное значение типа short.

LLONG_MIN (-9223372036854775807)

Минимальное значение типа long long.

LLONG_MAX (9223372036854775807)

Максимальное значение типа long long.

ULLONG_MAX (18446744073709551615)

Максимальное значение типа unsigned long long.

Некоторые полезные конфигурационные константы определены в заголовочном файле <stdio.h>.

BUFSIZ

Размер буферов ввода/вывода.

L_ctermid

Максимальный размер символьного массива для хранения имени управляющего терминала - результата функции ctermid().

L_tmpnam

Максимальный размер символьного массива для хранения имени временного файла – результата функции tmpnam().

FILENAME_MAX

Максимально допустимое число байт в имени открываемого файла.

TMP_MAX (25)

Максимально допустимое число обращений к функции tmpnam(), при котором гарантируется уникальность генерируемых имен.

Упоминавшаяся ранее служебная программа getconf

getconf [-v спецификация] 
             конфигурационный_параметр
getconf [-v спецификация] 
             конфигурационный_параметр
маршрутное_имя

а также функции sysconf(), confstr(), fpathconf() и pathconf() (см. листинг 10.5) предназначены для опроса значений системных параметров во время выполнения. Первая из перечисленных функций опрашивает лимитирующие конфигурационные параметры, имеющие числовые значения, вторая возвращает конфигурационные цепочки символов, а две последние – конфигурационные значения, относящиеся к файлам.

#include <unistd.h>
long sysconf (int name);
size_t confstr (int name, char *buf, 
                             size_t len);
long fpathconf (int fildes, int name);
long pathconf (const char *path, int name);

Утилита getconf выдает на стандартный вывод значение конфигурационного параметра, которое во второй форме может быть специфичным для файловой системы или даже для файла. В первом приближении можно считать, что по набору опрашиваемых параметров она эквивалентна совокупности функций, представленных в листинге 10.5, только в именах, обслуживаемых функцией confstr(), нужно удалять префикс _CS_.

Опция

-v спецификация

задает опрашиваемую конфигурацию и версию. По умолчанию используется подразумеваемое для данной реализации окружение.

Например, если определен конфигурационный параметр _POSIX_V6_ILP32_OFF32, то команда вида

getconf -v _POSIX_V6_ILP32_OFF32 ...

опрашивает значения, соответствующие 32-битной среде компиляции.

Приведем несколько примеров использования служебной программы getconf. Команда

getconf LINE_MAX
может выдать 2048, а команда
getconf PATH_MAX /tmp

в используемой автором версии ОС Linux выдает 4096.

Обращение со служебной программой getconf требует известной аккуратности. Нужно помнить, что конфигурационный параметр может быть неопределенным, а указанное имя не обслуживаться вообще; в последнем случае на стандартный вывод ничего не выдается. В листинге 10.6 показан фрагмент командного файла, где сделана попытка учесть эти нюансы.

if unm=$(getconf "$@"); then
if [ "$unm" = "undefined" ]; then
echo Значение "$@" не определено
else
echo Значение "$@" равно $unm.
fi
else
echo Ошибка при выполнении getconf
fi

Функция sysconf() опрашивает описанные выше конфигурационные параметры с числовыми значениями, определенные в заголовочных файлах <unistd.h> и <limits.h> ; аргумент name задает имя опрашиваемого параметра.

Функция confstr() возвращает значения для следующих конфигурационных параметров, определенных в заголовочном файле <unistd.h> и заданных аргументом name:

_CS_PATH

Значение переменой окружения PATH, позволяющее найти все стандартные служебные программы.

_CS_POSIX_V6_ILP32_OFF32_CFLAGS

_CS_POSIX_V6_ILP32_OFF32_LDFLAGS

_CS_POSIX_V6_ILP32_OFF32_LIBS

Опции и библиотеки для компиляции и редактирования внешних связей приложений, использующих 32-битную программную модель.

_CS_POSIX_V6_ILP32_OFFBIG_CFLAGS

_CS_POSIX_V6_ILP32_OFFBIG_LDFLAGS

_CS_POSIX_V6_ILP32_OFFBIG_LIBS

_CS_POSIX_V6_LP64_OFF64_CFLAGS

_CS_POSIX_V6_LP64_OFF64_LDFLAGS

_CS_POSIX_V6_LP64_OFF64_LIBS

_CS_POSIX_V6_LPBIG_OFFBIG_CFLAGS

_CS_POSIX_V6_LPBIG_OFFBIG_LDFLAGS

_CS_POSIX_V6_LPBIG_OFFBIG_LIBS

Опции и библиотеки для других программных моделей.

_CS_POSIX_V6_WIDTH_RESTRICTED_ENVS

Список имен поддерживаемых реализацией программных моделей, в которых размеры типов blksize_t, cc_t, mode_t, nfds_t, pid_t, ptrdiff_t, size_t, speed_t, ssize_t, suseconds_t, tcflag_t, useconds_t, wchar_t и wint_t не больше, чем long.

Значение конфигурационного параметра возвращается функцией confstr() в буфере buf длины len (при необходимости значение обрезается). Результатом вызова confstr() является минимальный размер буфера, где можно разместить опрашиваемое значение вместе с завершающим нулевым байтом. Если в качестве len задан нуль, в буфер ничего не помещается, но требуемый размер выдается. В листинге 10.7 показана программа, динамически резервирующая буфер необходимого размера и получающая в нем стандартное значение списка поиска.

#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
int main (void) {
size_t buf_len;
char *buf;
if ((buf_len = confstr (_CS_PATH, 
   (char *) NULL, (size_t) 0)) > 0) {
if ((buf = (char *) malloc (buf_len)) != NULL)
   {
   (void) confstr (_CS_PATH, buf, buf_len);
   printf ("Standard PATH: %s\n", buf);
   }
}
return 0;
}

В результате выполнения этой программы может быть выдано:

Standard PATH: /bin:/usr/bin

Функции fpathconf() и pathconf() служат для опроса текущих значений лимитирующих конфигурационных параметров или наличия необязательных возможностей, ассоциированных с файлами или каталогами, которые могут задаваться открытыми дескрипторами (аргумент fildes функции fpathconf() ) или маршрутными именами (аргумент path функции pathconf() ).

Аргумент name задает имя опрашиваемого параметра. Выше мы уже описывали подобные конфигурационные параметры: FILESIZEBITS, LINK_MAX, MAX_CANON, MAX_INPUT, NAME_MAX, PATH_MAX, PIPE_BUF, SYMLINK_MAX, _POSIX_CHOWN_RESTRICTED, _POSIX_NO_TRUNC, _POSIX_VDISABLE, _POSIX_ASYNC_IO, _POSIX_PRIO_IO, _POSIX_SYNC_IO. Допустимые значения для name получаются путем приписывания к имени параметра префикса _PC_ (например, _PC_PATH_MAX ) или замены префикса _POSIX_ на _PC_ (например, _PC_SYNC_IO ).

Отметим, что во время работы приложения результаты, возвращаемые функциями fpathconf() и pathconf(), могут меняться, поскольку существует вероятность монтирования и/или размонтирования файловых систем, поддерживающих различные необязательные возможности и разные лимиты. В этом смысле результаты функций sysconf() и confstr() более стабильны.

Вернуться к учебному плану