Next Previous Contents

27. Параметры Конфигурации Системы

Функции и макрокоманды, перечисленные в этой главе дают информацию относительно параметров конфигурации операционной системы, например, ограничений пропускной способности, присутствие необязательных POSIX возможностей, и заданный по умолчанию путь для исполняемых файлов (см. Раздел 27.12 [Строковые Параметры]).

27.1 Общие Ограничения Пропускной способности

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

Каждый из следующих параметров ограничения имеет макрокоманду, которая определена в " limits.h " только, если система имеет фиксированное, однородное ограничение для рассматриваемого параметра. Если система позволяет различным файловым системам или файлам иметь различные ограничения, то макрокоманда неопределена; используйте sysconf, чтобы выяснить ограничение, которое применяется в специфическое время на специфической машине. См. Раздел 27.4 [Sysconf].

Каждый из этих параметров также имеет другую макрокоманду, с именем, начинающимся с " _POSIX ", которая дает самое низкое значение, которое ограничению позволяется иметь на любой системе POSIX. См. Раздел 27.5 [Минимумы].

       int ARG_MAX
Если этот макрос определен, то это неизменяющийся максимум объединенной длины argv и environ аргументов которые могут быть переданы функции exec.
       int CHILD_MAX
Если этот макрос определен, то это неизменяющееся число максимума процессов, которые могут существовать с тем же самым реальным пользовательским ID одновременно.
       int OPEN_MAX
Если этот макрос определен, то это неизменяющееся число максимума файлов, которые одиночный процесс может иметь открытым одновременно.
       int STREAM_MAX
Если этот макрос определен, то это неизменяющееся число максимума потоков, которые одиночный процесс может иметь открытым одновременно. См. Раздел 7.3 [Открытие Потоков].
       int TZNAME_MAX
Если этот макрос определен, то это неизменяющаяся максимальная длина имени часового пояса. См. Раздел 17.2.6 [Функции Часового пояса].

Эти макрокоманды ограничений всегда определяются в " limits.h ".

       int NGROUPS_MAX
Максимальное число ID дополнительных групп, которые один процесс может иметь.
       int SSIZE_MAX
Самое большое значение, которое может содержаться в объекте типа ssize_t. Действительно, это - ограничение числа байтов, которые могут читаться или записываться в одиночной операции.

Эта макрокоманда определена во всех системах POSIX, т. к. это ограничение никогда не переконфигурируется.

       int RE_DUP_MAX  (макрос)
Самое большое число повторений, которое Вам позволяется в конструкции " \{min,max\} " в регулярном выражении.

Эта макрокоманда определена во всех POSIX.2 системах, т. к. POSIX.2 говорит, что она должна всегда определяться, даже если не имеется никакого специфического наложенного ограничения.

27.2 Полные Опции Системы

POSIX определяет некоторые системно-специфические опции, которые не все системы POSIX поддерживают. Так как эти опции обеспечиваются в ядре, а не в библиотеке, просто использование библиотек GNU C не гарантирует любой из этих возможностей; это зависит от системы, которую Вы используете.

Вы можете проверять доступность данной опции, используя макрокоманды в этом разделе, вместе с функцией sysconf. макрокоманды определены только, если Вы включаете " unistd.h ".

Для следующих макрокоманд, если макрокоманда определена в " unistd.h ", то опция обеспечивается.

Иначе, опция может или не может обеспечена; используйте sysconf для выяснения. См. Раздел 27.4 [Sysconf].

       int _POSIX_JOB_CONTROL  (макрос)
Если этот символ определен, это указывает что система поддерживает управление заданиями. Иначе, реализация ведет себя, как будто все процессы внутри сеанса принадлежат одиночной группе процессов. См. Главу 24 [Управление заданиями].
       int _POSIX_SAVED_IDS  (макрос)
Если этот символ определен, это указывает, что система запоминает эффективный ID пользователя и группы процесса прежде, чем она выполняет исполняемый файл с установкой set-user-ID или set-group-ID битов, и что явное изменение эффективного пользователя или группы обратно к этим значениям разрешается. Если эта опция не определена, то, если непривилегированный процесс изменяет эффективного пользователя или группу на реального пользователя или группу процесса, то он не может изменять их обратно снова. См. раздел 25.8 [ВКЛЮЧЕНИЕ/ОТКЛЮЧЕНИЕ Setuid].

Для следующих макрокоманд, если макрокоманда определена в " unistd.h ", то значение указывает, обеспечивается ли опция. Значение -1 означает нет, а любое другое значение означает да. Если макрокоманда не определена, то опция может или не может обеспечиваться; используйте sysconf для выяснения. См. Раздел 27.4 [Sysconf].

       int _POSIX2_C_DEV  (макрос)
Если этот символ определен, это указывает, что система имеет POSIX.2 команду компилятора C, c89. Библиотека GNU C всегда определяет его как 1.
       int _POSIX2_FORT_DEV  (макрос)
Если этот символ определен, это указывает, что система имеет POSIX.2 команду компилятора ФОРТРАНа, fort77. Библиотека GNU C никогда не определяет его, т. к. мы не знаем то, что система имеет.
       int _POSIX2_FORT_RUN
Если этот символ определен, это указывает, что система имеет POSIX.2 команду asa для интерпретирования управление каретки ФОРТРАНа. Библиотека GNU C никогда не определяет его, т. к. мы не знаем что имеет система.
       int _POSIX2_LOCALEDEF  (макрос)
Если этот символ определен, это указывает, что система имеет POSIX.2 команду localedef. Библиотека GNU C никогда не определяет его.
       int _POSIX2_SW_DEV  (макрос)
Если этот символ определен, это указывает, что система имеет POSIX.2 команды ar, make, и strip. Библиотека GNU C всегда определяет его как 1.

27.3 Которая Версия POSIX Обеспечивается

       long int _POSIX_VERSION  (макрос)
Эта константа представляет версию POSIX.1 стандарта который соответствует реализация. Для реализации, соответсвующей 1990 POSIX.1 стандарту, значение - целое число 199009L. _POSIX_VERSION всегда определяется (в " unistd.h ") в любой системе POSIX.

Примечание Использования: Не пробуйте тестировать поддерживает ли система POSIX, включая " unistd.h " и тогда проверяя, определен ли _POSIX_VERSION. На не - posix системах, это возможно выдаст ошибку, т. к. там нет никакого " unistd.h ". Мы не знаем любого способа, которым Вы можете надежно проверять при трансляции, поддерживает ли ваша целевая система POSIX или существует ли " unistd.h ".

Компилятор GNU C предопределяет символ __ POSIX __, если целевая система - система POSIX. Если Вы не используете любой, другие компиляторы на системах POSIX, проверяя определенный (__ POSIX __) надежно обнаружят такие системы.

       long int _POSIX2_C_VERSION  (макрос)
Эта константа представляет версию POSIX.2 стандарта, который поддерживает библиотека и ядро системы. Мы не знаем какое значение это будет для первой версии POSIX.2 стандарта, т. к. значение включает год и месяц, в котором стандарт официально принят.

Значение этого символа не говорит ничто относительно утилит, установленных на системе.

Примечание Использования: Вы можете использовать эту макрокоманду, чтобы проверить что POSIX.1 библиотека систем поддерживает POSIX.2 также. Любая POSIX.1 система содержит " unistd.h ", так что включайте этот файл и тогда проверяйте defined (_POSIX2_C_VERSION).

27.4 Использование sysconf

Когда ваша система имеет ограничения системы с перестраиваемой конфигурацией, Вы можете использовать функцию sysconf для выяснения значений, которые применяются для любой специфической машины. Функция и связанные константы параметров объявлены в заглавном файле " unistd.h ".

Определение sysconf

       long int sysconf (int parameter)  (функция)
Эта функция используется, для запроса относительно параметров системы. Аргумент parameter должен быть один из " _SC_ " символов, перечисленных ниже.

Нормальное возвращаемое значение из sysconf - значение, которое Вы запросили. Значение -1 возвращается, если реализация не налагает ограничения, и в случае ошибки.

Следующие errno условия ошибки определены для этой функции:

EINVAL

значение параметра недопустимо.

Константы для Sysconf Параметров

Имеются символические константы которые используют как аргументы в sysconf. Значения - все целочисленные константы (более специально, значения перечислимого типа).

       _SC_ARG_MAX
Запрос относительно параметра, соответствующего ARG_MAX.
       _SC_CHILD_MAX
Запрос относительно параметра, соответствующего CHILD_MAX.
       _SC_OPEN_MAX
Запрос относительно параметра, соответствующего OPEN_MAX.
       _SC_STREAM_MAX
Запрос относительно параметра, соответствующего STREAM_MAX.
       _SC_TZNAME_MAX
Запрос относительно параметра, соответствующего TZNAME_MAX.
       _SC_NGROUPS_MAX
Запрос относительно параметра, соответствующего NGROUPS_MAX.
       _SC_JOB_CONTROL
Запрос относительно параметра, соответствующего
       _POSIX_JOB_CONTROL.
       _SC_SAVED_IDS
Запрос относительно параметра, соответствующего
       _POSIX_SAVED_IDS.
       _SC_VERSION
Запрос относительно параметра, соответствующего _POSIX_VERSION.
       _SC_CLK_TCK
Запрос относительно параметра, соответствующего CLOCKS_PER_SEC; см. Раздел 17.1.1 [Основное Время CPU].
       _SC_2_C_DEV
Запрос относительно того, имеет ли система POSIX.2 команду компилятора C, c89.
       _SC_2_FORT_DEV
Запрос относительно того, имеет ли система POSIX.2 команду компилятора ФОРТРАНа, fort77.
       _SC_2_FORT_RUN
Запрос относительно того, ли система имеет POSIX.2 команду asa для интерпретирования управления каретки ФОРТРАНа.
       _SC_2_LOCALEDEF
Запросите относительно того, имеет ли система POSIX.2 команду localedef.
       _SC_2_SW_DEV
Запросите относительно того, имеет ли система POSIX.2 команды ar, make, и strip.
       _SC_BC_BASE_MAX
Запрос относительно максимального значения obase в утилите bc.
       _SC_BC_DIM_MAX
Запрос относительно максимального размера массива в утилите bc.
       _SC_BC_SCALE_MAX
Запрос относительно максимального значения масштаба в утилите bc.
       _SC_BC_STRING_MAX
Запрос относительно максимального размера строковой константы в утилите bc.
       _SC_COLL_WEIGHTS_MAX
Запрос относительно максимального числа весов, которые могут обязательно использоваться в определении последовательности объединений для стандарта.
       _SC_EXPR_NEST_MAX
Запрос относительно максимального числа выражений, вложенных внутри круглых скобок при использовании утилиты expr.
       _SC_LINE_MAX
Запрос относительно максимального размера текстовой строки который POSIX.2 текстовые утилиты могут обрабатывать.
       _SC_EQUIV_CLASS_MAX
Запрос относительно максимального числа весов, которые могут быть назначены на вход LC_COLLATE класса (" порядок " ключевое слово в определении стандарта). Библиотека GNU C не поддерживает определения стандарта.
       _SC_VERSION
Запрос относительно номера версии POSIX.1 поддерживаемой ядром.
       _SC_2_VERSION
Запрос относительно номера версии POSIX.2, поддерживаемой утилитами системы.
       _SC_PAGESIZE
Запрос относительно виртуального размера страницы памяти машины. Getpagesize возвращает то же самое значение. См. <неопределенный> [XXX getpagesize].

Примеры sysconf

Мы рекомендуем, чтобы Вы сначала проверили макроопределение для параметра в котором Вы заинтересованы, и вызывали sysconf только, если макрокоманда не определена. Например, вот как проверяют обеспечивается ли управление заданиями:

                int
                have_job_control (void)
                {
                #ifdef _POSIX_JOB_CONTROL
                        return 1;
                #else
                        int value = sysconf (_SC_JOB_CONTROL);
                        if (value < 0)
                                fatal (strerror (errno));
                        return value;
                #endif
                }
       Here is how to get the value of a numeric limit:
                int
                get_child_max ()
                {
                #ifdef CHILD_MAX
                        return CHILD_MAX;
                #else
                        int value = sysconf (_SC_CHILD_MAX);
                        if (value < 0)
                                fatal (strerror (errno));
                        return value;
                #endif
                }

27.5 Минимальные Значения для Общих Ограничений Емкости

Имеются названия для POSIX минимальных верхних пределов для параметров ограничений системы.

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

       _POSIX_ARG_MAX
Значение этой макрокоманды - наименьшее ограничение, разрешенное POSIX для максимума объединенной длины argv и других аргументов, которые могут быть переданы запускаемой функции. Значение - 4096.
       _POSIX_CHILD_MAX
Значение этой макрокоманды наименьшее ограничение разрешенное POSIX для максимального числа одновременных процессов на реального пользователя. Значение - 6.
       _POSIX_NGROUPS_MAX
Значение этой макрокоманды - наименьшее значение ограничения, разрешенное POSIX для максимального числа дополнительных групп процесса. Значение - 0.
       _POSIX_OPEN_MAX
Значение этой макрокоманды - наименьшее значение ограничения, разрешенное POSIX для максимального числа файлов, которые одиночный процесс может иметь открытым одновременно. Значение - 16.
       _POSIX_SSIZE_MAX
Значение этой макрокоманды - наименьшее значение ограничения, разрешенное POSIX для максимального значения, которое может быть сохранено в объекте типа ssize_t. Значение - 32767.
       _POSIX_STREAM_MAX
Значение этой макрокоманды - наименьшее значение ограничения, разрешенное POSIX для максимального числа потоков, которые одиночный процесс может иметь открытым одновременно. Значение - 8.
       _POSIX_TZNAME_MAX
Значение этой макрокоманды - наименьшее значение ограничения, разрешенное POSIX для максимальной длины имени часового пояса. Значение - 3.
       _POSIX2_RE_DUP_MAX
Значение этой макрокоманды - наименьшее значение ограничения, разрешенное POSIX для чисел, используемых в " \ {min, max\} " конструкциях в регулярном выражении. Значение - 255.

27.6 Ограничения Емкости Файловой системы

POSIX.1 стандарт определяет ряд параметров, которые описывают ограничения файловой системы. Система может иметь фиксированное, однородное ограничение для параметра, но это не обычный случай. На большинстве систем, для различных файловых систем (и, для некоторых параметров, даже для различных файлов) имеются различные максимальные ограничения. Например, если Вы используете NFS для устанавливки некоторых файловых систем из других машин.

Каждая из следующих макрокоманд определена в " limits.h " только, если система имеет фиксированное, однородное ограничение для рассматриваемого параметра. Если система позволяет различным файловым системам или файлам иметь различные ограничения, то макрокоманда неопределена; используйте pathconf или fpathconf, чтобы выяснить ограничение, которое применяется к специфическому файлу. См. Раздел 27.9 [Pathconf].

Каждый параметр также имеет другую макрокоманду, с именем, начинающимся с " _POSIX ", которая дает самое низкое значение, которое ограничению позволяется иметь на любой POSIX системе. См. Раздел 27.8 [Минимумы Файла].

       int LINK_MAX     (макрос)
Однородное ограничение системы для числа имен для данного файла. См. Раздел 9.3 [Жесткие связи].
       int MAX_CANON    (макрос)
Однородное ограничение системы для количества текста в строке ввода, когда допускается входное редактирование. См. Раздел 12.3 [Каноническиий или Нет].
       int MAX_INPUT    (макрос)
Однородное ограничение системы для общего числа символов, печатаемых вперед как ввод. См. Раздел 12.2 [Очереди ввода - вывода].
       int NAME_MAX     (макрос)
Однородное ограничение системы для длины компонента имени файла.
       int PATH_MAX     (макрос)
Однородное ограничение системы для длины всего имени файла (то есть аргумент, данный системным вызовам типа open).
       int PIPE_BUF     (макрос)
Однородное ограничение системы для числа байтов, которые можно написать в трубопровод быстро. См. Главу 10 [Трубопроводы и FIFOs].

Это - альтернативные имена макрокоманд.

       int MAXNAMLEN    (макрос)
Это - имя BSD для NAME_MAX. Она определена в " dirent.h ".
       int FILENAME_MAX (макрос)
Значение этой макрокоманды - целочисленное постоянное выражение, которое представляет максимальную длину строки имени файла. Она определена в " stdio.h ".

В отличие от PATH_MAX, эта макрокоманда определена, даже если не имеется никакого фактического наложенного ограничения. В таком случае, значение - обычно очень большое количество. Так всегда в системе GNU.

Примечание Использования: Не используйте FILENAME_MAX как размер массива, чтобы сохранить имя файла! Вы не можете возможно делать массив таким большим! Используйте динамическое резервирование (см. Главу 3 [Распределение памяти]).

27.7 Необязательные Возможности в Поддержке Файлов

POSIX определяет некоторые системно-специфические опции в системных вызовах для файлов. Некоторые системы поддерживают эти опции, а другие - нет. Так как эти опции обеспечиваются в ядре, а не в библиотеке, просто использование библиотеки GNU С не гарантирует, что любая из этих возможностей обеспечивается; это зависит от системы, которую Вы используете. Они могут также изменяться между файловыми системами на одиночной машине.

Этот раздел описывает макрокоманды, которые Вы можете проверять, чтобы определить, обеспечивается ли специфическая опция на вашей машине. Если данная макрокоманда определена в " unistd.h ", то значение, говорит обеспечивается ли соответствующая возможность. (Значение -1 указывает нет; любое другое значение указывает да.) если макрокоманда неопределена, это означает специфические файлы могут и не поддерживать эту возможность.

Так как все машины, которые поддерживают библиотеку GNU C также поддерживают NFS, можно делать общее утверждение относительно того, все ли файловые системы поддерживают возможности _POSIX_NO_TRUNC и _POSIX_CHOWN_RESTRICTED. Так что эти имена никогда не определены как макрокоманды в библиотеке GNU C.

       int _POSIX_CHOWN_RESTRICTED  (макрос)
Если эта опция есть, chown функция ограничена так, что единственые изменения, разрешенные непривилегированным процессам: изменить владельца группы файла либо на эффективный ID группы процесса, либо на один из ID дополнительных групп. См. Раздел 9.8.4 [Владелец Файла].
       int _POSIX_NO_TRUNC  (макрос)
Если эта опция обеспечивается, когда компоненты имени файла длиннее чем NAME_MAX, генерируется ENAMETOOLONG ошибка. Иначе, компоненты имени файла, которые являются слишком длинными будут тихо усечены.
       unsigned char _POSIX_VDISABLE  (макрос)
Эта опция значима только для файлов, которые являются устройствами терминала. Если она допускается, то обработчик для специальных управляющих символов, может быть заблокирован индивидуально. См. Раздел 12.4.9 [Специальные Символы].

Если одна из этих макрокоманд является неопределенной, это означает что эта опция может быть определена в действительности для некоторых файлов и не определена для других. Чтобы запрашивать относительно специфического файла, вызовите pathconf или fpathconf. См. Раздел 27.9 [Pathconf].

27.8 Минимальные Значения для Ограничений Файловой системы

Имеются имена для POSIX минимальных верхних пределов для некоторых из вышеупомянутых параметров.

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

       _POSIX_LINK_MAX
Наименьшее значение предела, разрешенное POSIX для максимального значения числа связей файла. Значение этой константы - 8; таким образом, Вы можете всегда создавать до восьми имен для файла без столкновений с ограничением системы.
       _POSIX_MAX_CANON
Наименьшее значение предела, разрешенное POSIX для максимального числа байтов в каноническиой входной строке из устройства терминала. Значение этой константы - 255.
       _POSIX_MAX_INPUT
Наименьшее значение предела, разрешенное POSIX для максимального числа байтов во входной очереди устройства терминала (или буфере клавиатуры). См. Раздел 12.4.4 [Режимы Ввода]. Значение этой константы - 255.

       _POSIX_NAME_MAX
Наименьшее значение предела, разрешенное POSIX для максимального числа байтов в компоненте имени файла. Значение этой константы - 14.
       _POSIX_PATH_MAX
Наименьшее значение предела, разрешенное POSIX для максимального числа байтов в имени файла. Значение этой константы - 255.
       _POSIX_PIPE_BUF
Наименьшее значение предела, разрешенное POSIX для максимального числа байтов, которые можно написать в трубопровод быстро. Значение этой константы - 512.

27.9 Использование pathconf

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

Эти функции и связанные константы для аргумента parameter объявлены в заглавном файле " unistd.h ".

       long int pathconf (const char *filename, int parameter)  (функция)
Эта функция используется, чтобы запросить относительно ограничений, которые применяются к файлу, именованному filename.

Аргумент parameter должен быть одной из " _PC_ " констант, перечисленных ниже.

Нормальное возвращаемое значение из pathconf - значение, которое Вы запросили. Значение -1 будет возвращено, если реализация не налагает ограничений, и в случае ошибки.

В вышеупомянутом случае, errno не установлена, в то время как в последнем случае, errno установлена, чтобы указать причину проблемы. Так что единственый способ использовать эту функцию robustly состоит в том, чтобы сохранить 0 в errno перед ее вызовом.

Кроме обычных синтаксических ошибок имени файла (см. Раздел 6.2.3 [Ошибки Имени файла]), следующие условия ошибки определены для этой функции:

EINVAL

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

       long int fpathconf (int filedes, int parameter)  (функция)
Точно такая же как pathconf за исключением того, что вместо имени файла используется описатель открытого файла, чтобы определить файл, для которого запрошена информация.

Следующие errno условия ошибки определены для этой функции:

EBADF

filedes аргумент - не допустимый описатель файла.

EINVAL

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

Имеются символические константы, которые Вы можете использовать как аргумент parameter в pathconf и fpathconf. Значения - целочисленные константы.
       _PC_LINK_MAX
Запрос относительно значения LINK_MAX.
       _PC_MAX_CANON
Запрос относительно значения MAX_CANON.
       _PC_MAX_INPUT
Запрос относительно значения MAX_INPUT.
       _PC_NAME_MAX
Запрос относительно значения NAME_MAX.
       _PC_PATH_MAX
Запрос относительно значения PATH _MAX.
       _PC_PIPE_BUF
Запрос относительно значения PIPE_BUF.
       _PC_CHOWN_RESTRICTED
Запрос относительно значения _POSIX_CHOWN_RESTRICTED.
       _PC_NO_TRUNC
Запрос относительно значения _POSIX_NO_TRUNC.
       _PC_VDISABLE
Запрос относительно значения _POSIX_VDISABLE.

27.10 Ограничения для Утилит

POSIX.2 стандарт определяет некоторые ограничения системы, к которым Вы можете обращаться через sysconf, которые относятся к поведению некоторых утилит а не к поведению библиотеки или операционной системы.

Библиотека GNU C определяет макрокоманды для этих ограничений, и sysconf возвращает значения для них, если Вы спрашиваете; но эти значения не передают никакую значимую информацию. Они - просто самые маленькие значения которые POSIX. 2 разрешает.

       int BC_BASE_MAX  (макрос)
Самое большое значение obase, который утилита bc, как гарантируют, будет поддерживать.
       int BC_SCALE_MAX (макрос)
Самое большое значение масштаба, который утилита bc, как гарантируют, будет поддерживать.
       int BC_DIM_MAX   (макрос)
Самое большое число элементов в одном массиве, который утилита bc, как гарантируют, будет поддерживать.
       int BC_STRING_MAX        (макрос)
Самое большое число символов в одной строковой константе, которую утилита bc, как гарантируют, будет поддерживать.
       int BC_DIM_MAX   (макрос)
Самое большое число элементов в одном массиве, который утилита bc, как гарантируют, будет поддерживать.
       int COLL_WEIGHTS_MAX     (макрос)
Самое большое число весов, которые могут обязательно использоваться в определении последовательности объединений для стандарта.
       int EXPR_NEST_MAX        (макрос)
Максимальное число выражений, которые могут быть вложены круглыми скобками для утилиты expr.
       int LINE_MAX     (макрос)
Самая большая текстовая строка, которую POSIX.2 текстовые утилиты могут поддерживать. (Если, Вы используете GNU версии этих утилит, то нет никакого фактического ограничения за исключением тех, что наложены доступной виртуальной памятью, но не никакого способа, которым библиотека может сообщать Вам это.)

27.11 Минимальные Значения для Пределов Утилит

       _POSIX2_BC_BASE_MAX
Наименьшее значение предела, разрешенное POSIX.2 для максимального значения obase в утилите bc. Значение - 99.
       _POSIX2_BC_DIM_MAX
Наименьшее значение предела, разрешенное POSIX.2 для максимального размера массива в утилите bc. Значение - 2048.

       _POSIX2_BC_SCALE_MAX
Наименьшее значение предела, разрешенное POSIX.2 для максимального значения масштаба в утилите bc. Значение - 99.
       _POSIX2_BC_STRING_MAX
Наименьшее значение предела, разрешенное POSIX. 2 для максимального размера строковой константы в утилите bc. Значение - 1000.
       _POSIX2_COLL_WEIGHTS_MAX
Наименьшее значение предела, разрешенное POSIX. 2 для максимального числа весов, которые могут использоваться в определении последовательности объединений для стандарта. Значение - 2.
       _POSIX2_EXPR_NEST_MAX
Наименьшее значение предела, разрешенное POSIX. 2 для максимального числа выражений, вложенных внутри круглых скобок при использовании утилиты expr. Значение - 32.
       _POSIX2_LINE_MAX
Наименьшее значение предела, разрешенное POSIX. 2 для максимального размера текстовой строки, которую текстовые утилиты могут обрабатывать. Значение - 2048.

27.12 Строковые Параметры

POSIX. 2 определяет способ получить строковые параметры из операционной системы - функцией confstr:

       size_t confstr (int parameter, char *buf, size_t len)  (функция)
Эта функция читает значение строкового параметра системы, сохраняя строку в len байты пространства памяти, начинающегося в buf. Аргумент parameter должен быть один из " _CS_ " символов, перечисленных ниже.

Нормальное возвращаемое значение из confstr - длина строкового значения, о котором Вы просили. Если Вы обеспечиваете пустой указатель для buf, то confstr, не пробует сохранять строку; она только возвращает длину. Значение 0 указывает ошибку.

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

Следующие errno условия ошибки определены для этой функции:

EINVAL

значение параметра недопустимо.

В настоящее время имеется только один параметр, который Вы можете читать с confstr:

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

Способ использовать confstr без любого произвольного ограничения строкового размера состоит в том, чтобы вызвать ее дважды: сначала вызвать ее, чтобы получить длину, зарезервировать буфер соответственно, и тогда вызывать confstr снова, чтобы заполнить буфер, примерно так:

        char *
        get_default_path (void)
        {
                size_t len = confstr (_CS_PATH, NULL, 0);
                char *buffer = (char *) xmalloc (len);
                if (confstr (_CS_PATH, buf, len + 1) == 0) {
                        free (buffer);
                        return NULL;
                }
                return buffer;
         }


Next Previous Contents