Опубликован: 15.06.2004 | Доступ: свободный | Студентов: 2286 / 579 | Оценка: 4.35 / 3.96 | Длительность: 27:47:00
ISBN: 978-5-9556-0011-6

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

< Лекция 9 || Лекция 10: 12345 || Лекция 11 >

Приведем несколько примеров использования служебной программы 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
Листинг 10.6. Пример аккуратной обработки результатов утилиты getconf.

Функция 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;
}
Листинг 10.7. Пример аккуратного опроса конфигурационной цепочки символов.

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

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() более стабильны.

< Лекция 9 || Лекция 10: 12345 || Лекция 11 >
Антон Коновалов
Антон Коновалов

В настоящее время актуальный стандарт - это POSIX 2008 и его дополнение POSIX 1003.13
Планируется ли актуализация материалов данного очень полезного курса?

Павел Храмцов
Павел Храмцов
Россия
Денис Комаров
Денис Комаров
Россия, Москва