Разработка приложений в среде Linux. Второе издание
Шрифт:
Функция
Функция
Некоторые существующие приложения записываются с помощью структуры, усложняющей хранение имени и файлового дескриптора для очистки элемента utmp. Из-за этого библиотека
16.1.5. Запись вручную
Область обработки utmp и wtmp является одной из тех противоречивых областей, где механизмы различаются между системами и меняются на протяжении лет; даже определение информации, доступной в utmp и wtmp, до сих пор различается между системами. Изначально utmp и wtmp были просто массивами структур, записанных на диск; через некоторое время были созданы программные интерфейсы приложений (API) для надежной обработки записей.
По крайней мере, два таких интерфейса были официально стандартизованы; исходный интерфейс utmp (описанный в XSI, XPG2 и SVID2) и расширенный интерфейс utmpx (описанный в XPG4.2 и в поздних версиях POSIX). В Linux доступны оба интерфейса (utmp и utmpx). Интерфейс utmp, широко варьирующийся между машинами, имеет набор определений, которые делают возможной запись переносимого кода. Этот код пользуется преимуществом расширений, предоставляемых glibc. Более строго стандартизованный интерфейс utmpx в данный момент не предоставляет эти определения, но все еще поддерживает расширения.
Интерфейс Linux utmp был изначально задуман как супермножество других существующих интерфейсов utmp, a utmpx был стандартизован как супермножество других существующих интерфейсов utmp; к счастью, оба набора во многом одинаковы. В Linux различие между структурами данных utmp и utmpx заключается лишь в букве x.
Если вы не хотите применять расширения, мы рекомендуем использовать интерфейс utmpx, поскольку он наиболее переносим, пока вы не используете расширения, и строго стандартизован.
Однако если вы хотите применять расширения, мы рекомендуем использовать интерфейс utmp, поскольку glibc предоставляет определения, позволяющие записать переносимый код, пользующийся преимуществами расширений.
Существует также смешанный подход — включите оба заголовочных файла и используйте определения, предоставляемые glibc для интерфейса utmp, чтобы решить, применять ли расширения в интерфейсе utmpx. Этого мы не рекомендуем, поскольку нет гарантии, что заголовочные файлы
Здесь документируются лишь наиболее распространенные расширения; документация glibc покрывает все поддерживаемые расширения. Функции utmp работают в терминах
Многие одинаковые элементы являются частью
Элементы массива символов необязательно являются строками, завершающимися
ut_type | Одно из следующих значений: EMPTY , INIT_PROCESS , LOGIN_PROCESS , USER_PROCESS , DEAD_PROCESS , BOOT_TIME , NEW_TIME , OLD_TIME , RUN_LVL или ACCOUNTING , каждое из которых описано ниже. |
ut_tv | Время, ассоциированное с событием. Это единственный элемент, кроме ut_type , определяемый POSIX как всегда подходящий для непустых элементов. В некоторых системах вместо этого есть элемент ut_time , измеряемый только в секундах. |
ut_pid | Идентификатор ассоциированного процесса для всех типов, заканчивающихся на _PROCESS . |
ut_id | Идентификатор inittab
_PROCESS . Это первое поле в незакомментированных строках файла /etc/inittab , где поля разделены символами : . Сетевые регистрации, не ассоциированные с inittab, могут использовать это по-другому; например, могут включать части информации об устройстве.4 |
ut_line | Строка (базовое имя устройства или номер локального дисплея для X), ассоциированная с процессом. Спецификация POSIX о состоянии ut_line не ясна; она не считает ut_line значащей для LOGIN_PROCESS , но с другой стороны предполагает, что она значащая для LOGIN_PROCESS , и это подтверждается на практике. POSIX утверждает, что ut_line значащая для USER_PROCESS . На практике она также часто значащая для DEAD_PROCESS , в зависимости от происхождения бездействующего процесса. |
ut_user | Обычно это имя зарегистрированного пользователя; это также может быть имя зарегистрированного процесса (обычно LOGIN ) в зависимости от значения ut_type . |
ut_host | Имя удаленного хоста, вошедшего в систему или иным образом ассоциированного с этим процессом. Элемент ut_host относится только к USER_PROCESS . Этот элемент не стандартизован POSIX. |
ut_exit | ut_exit.e_exit дает код завершения, что предоставляется макросом WEXITSTATUS , a ut_exit.e_termination дает сигнал, вызвавший завершение процесса (если он был завершен сигналом), что предоставляется макросом WTERMSIG . Этот элемент не стандартизован POSIX. |
ut_session | Идентификатор сеанса в системе X Window. Этот элемент не стандартизован POSIX. |
ut_addr_v6 | IP-адрес удаленного хоста в случае активизации USER_PROCESS подключением с удаленного хоста. Используйте функцию inet_ntop для генерирования печатного содержания. Если первая группа не равна нулю, тогда это адрес IPV4 (inet_ntop принимает аргумент AF_INET ); в противном случае это адрес IPV6 (inet_ntop принимает аргумент AF_INET6 ). Этот элемент не стандартизован POSIX. |
Элемент
EMPTY | В данной записи utmp нет достоверных данных (такие записи позже можно повторно использовать), поэтому игнорируйте ее содержимое. Другие элементы структуры являются незначащими. |
INIT_PROCESS | Приведенный процесс был порожден непосредственно инициализацией. Это значение могут устанавливать системные программы (обычно только сам процесс инициализации); приложения должны прочитывать и распознавать это значение, но не должны ее устанавливать. Значащими являются элементы ut_pid , ut_id и ut_tv . |
LOGIN_PROCESS | Экземпляры регистрационной программы, ожидающие регистрации пользователя. Элементы ut_id , ut_pid и ut_tv полезны; элемент ut_user полезен номинально (в Linux он сообщает LOGIN , но это имя процесса регистрации определяется реализацией в соответствии с POSIX). |
USER_PROCESS | Этот элемент определяет лидера сеанса для зарегистрированного пользователя. Это может быть регистрационная программа после регистрации пользователя, управляющая программа монитора либо сеанса для входа в X Window System, программа эмуляции терминала, сконфигурированная для пометки сеансов регистрации, или любая интерактивная регистрация пользователя. Значащими являются элементы ut_id , ut_user , ut_line , ut_pid и ut_tv . |
DEAD_PROCESS | Приведенный процесс был лидером сеанса для зарегистрированного пользователя, но завершился. Значащими являются элементы ut_id , ut_pid и ut_tv в соответствии POSIX. Элемент ut_exit (не установленный POSIX) значащий только в данном контексте. |
BOOT_TIME | Время начальной загрузки системы. В utmp это самая поздняя загрузка; в wtmp это элемент для каждой загрузки системы со времени очистки wtmp. Значащим является только ut_tv . |
OLD_TIME и NEW_TIME | Используются только для записи "скачков" времени. Записываются парами. Не рекомендуется зависеть от записи этих элементов в систему, даже если время на часах по какой-либо причине изменилось. |
RUN_LVL и ACCOUNTING | Внутренние системные величины; в приложениях использовать не следует. |