учебники, программирование, основы, введение в,

 

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

Опрос идентифицирующих данных хостов
Самую общую информацию о характеристиках хоста позволяют получить служебная программа uname
uname [-snrvma]
и одноименная функция.
#include <sys/utsname.h>
int uname (struct utsname *name);
Листинг 10.1. Описание функции uname
Функция uname( помещает информацию, идентифицирующую опрашиваемую систему, в структуру типа utsname, которая должна содержать по крайней мере следующие поля.
char sysname [];  /* Имя реализации ОС */
char nodename []; /* Имя хоста как узла */
/* коммуникационной сети */
char release [];  /* Номер выпуска ОС */
char version [];  /* Номер версии ОС */
char machine [];  /* Название аппаратной */
/* конфигурации */
Размер массивов не специфицируется, оговаривается только, что хранящиеся в них цепочки символов завершаются нулевым байтом.
Аналогичные данные выдает на стандартный вывод служебная программа uname, опции которой соответствуют полям структуры utsname (-m – выдать название аппаратной конфигурации, -n – имя узла, -s, -r и -v – имя реализации ОС, номера выпуска и версии, соответственно). Опция -a предписывает выдавать все; без опций выдается имя реализации.
Результат выполнения команды
uname -a
может выглядеть так, как показано в. Правда, здесь фигурирует нестандартная составляющая, выдаваемая по опции -p, – тип процессора (в данном случае unknown).
Linux t94 2.4.18-3 #1 Thu Apr 18 07:37:53
EDT 2002 i686 unknown
Листинг 10.2. Возможный результат выполнения команды uname -a.
Функция gethostname() возвращает в массиве name длины namelen   имя хоста. Подходящее значение для namelen – HOST_NAME_MAX + 1 (см. следующий раздел).
#include <unistd.h>
int gethostname (char *name, size_t namelen);
Листинг 10.3. Описание функции gethostname().
Опрос конфигурационных параметров хоста
Значения конфигурационных параметров – важнейшая характеристика хоста, а настройка на конфигурацию целевой системы – обязательный элемент мобильного программирования приложений. Подобная настройка может выполняться статически, средствами условной компиляции, а также динамически, путем опроса значений конфигурационных параметров во время выполнения.
Основная часть статической конфигурационной информации сосредоточена в упоминавшемся ранее заголовочном файле <unistd.h>. Кратко опишем наиболее важные характеристики.
_POSIX_VERSION
Поддерживаемая версия системного интерфейса для языка C стандарта POSIX. Для POSIX-2001 значение этой константы должно равняться 200112L. Предыдущей версии (1996 года) соответствует значение 199506L.
_POSIX2_VERSION
Поддерживаемая версия интерфейса к системным сервисам на уровне командного языка и служебных программ; для реализаций, соответствующих стандарту POSIX-2001, значение этой константы должно равняться 200112L.
В показан пример использования значения _POSIX_VERSION для условной компиляции.
#if _POSIX_VERSION >= 200112L
/* Используем новую функцию, применимую к  */
/* большим файлам                          */
off_t fpos = ftello (fp);
#else
/* Либо реализация поддерживает только     */
/* старую версию стандарта POSIX, либо     */
/* константа _POSIX_VERSION вообще не      */
/* определена.                             */
/* Используем старую, традиционную функцию */
/* опроса текущей позиции в файле          */
long fpos = ftell (fp);
#endif
Листинг 10.4. Пример условной компиляции с использованием конфигурационной константы _POSIX_VERSION.
Следующая группа констант описывает поддерживаемые необязательные возможности стандарта 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_FILENO – 1) и протокола (STDERR_FILENO – 2). Их нужно не анализировать, а использовать вместо явных числовых значений.
http://localhost:3232/img/empty.gifРазного рода лимиты на количество и размеры заданы в заголовочном файле <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() предназначены для опроса значений системных параметров во время выполнения. Первая из перечисленных функций опрашивает лимитирующие конфигурационные параметры, имеющие числовые значения, вторая возвращает конфигурационные цепочки символов, а две последние – конфигурационные значения, относящиеся к файлам.
#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);
Листинг 10.5. Описание функций sysconf(), confstr(), fpathconf() и pathconf().
Утилита getconf выдает на стандартный вывод значение конфигурационного параметра, которое во второй форме может быть специфичным для файловой системы или даже для файла. В первом приближении можно считать, что по набору опрашиваемых параметров она эквивалентна совокупности функций, представленных в, только в именах, обслуживаемых функцией 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 требует известной аккуратности. Нужно помнить, что конфигурационный параметр может быть неопределенным, а указанное имя не обслуживаться вообще; в последнем случае на стандартный вывод ничего не выдается. В показан фрагмент командного файла, где сделана попытка учесть эти нюансы.
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 задан нуль, в буфер ничего не помещается, но требуемый размер выдается. В показана программа, динамически резервирующая буфер необходимого размера и получающая в нем стандартное значение списка поиска.
#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() более стабильны.


http://localhost:3232/img/empty.gif

 
На главную | Содержание | < Назад....Вперёд >
С вопросами и предложениями можно обращаться по nicivas@bk.ru. 2013 г.Яндекс.Метрика