Вход/Регистрация
Разработка приложений в среде Linux. Второе издание
вернуться

Троан Эрик В.

Шрифт:

Функция

tcsetpgrp
позволяет процессу, работающему на терминале, сменить группу процессов переднего плана для этого терминала [108] .

int tcsetpgrp(int ttyfd, pid_t pgrp);

Первый параметр определяет tty, управляющая группа процессов которого изменяется, a

pgrp
является группой процессов, которую необходимо переместить на передний план. Процессы могут менять группу процессов переднего плана только для своего управляющего терминала. Если процесс, совершающий изменение, не принадлежит к группе процессов переднего плана на этом терминале, генерируется сигнал
SIGTTOU
, если только он не игнорируется или заблокирован [109] .

108

Реализации Unix старого типа предоставляли эту функцию с помощью

TIOCSPGRP ioctl
, до сих пор поддерживаемого Linux. Для сравнения,
tcsetpgrp
можно реализовать как
ioctl(ttyfd, TIOCSPGRP, &pgrp)
.

109

Более подробно о сигналах и их взаимодействии с управлением заданиями рассказывается в главе 12.

16.1.3. Принадлежность терминала

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

who
использует базу данных utmp для отображения списка зарегистрированных пользователей, а команда
last
— базу данных wtmp для отображения списка пользователей, зарегистрированных в системе после регенерации базы данных wtmp. В системах Linux база данных utmp хранится в файле
/var/run/utmp
, а база данных wtmp — в файле
/var/log/wtmp
.

Программы, использующие tty для сеансов регистрации пользователей (независимо от того, ассоциируются ли они с графической регистрацией), должны обновлять эти две системные базы данных, пока пользователь явно не сделает иной запрос; например, некоторые пользователи не хотят, чтобы каждый сеанс оболочки, запускаемый ими в эмуляторе терминала в системе X Window, перечислялся как процесс входа. Добавляйте только интерактивные сеансы, поскольку utmp и wtmp не предназначены для регистрации автоматизированных программ. Любые tty, не являющиеся контролирующими терминалами, обычно в базы данных utmp и wtmp не добавляются.

16.1.4. Запись с помощью

utempter

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

utempter
. Утилита
utempter
является setgid (или, при необходимости, setuid) с достаточными полномочиями для модификации баз данных utmp и wtmp. Доступ к ней можно получить через простую библиотеку. Утилита
utempter
проверяет, владеет ли процесс tty, который пытается войти в базу данных utmp до разрешения операции,
utempter
предназначена только для pty; другие tty обычно открываются демонами с достаточными полномочиями для модификации файлов системных баз данных.

#include <utempter.h>

void addToUtmp(const char *pty, const char *hostname, int ptyfd);

void removeLineFromUtmp(const char *pty, int ptyfd);

void removeFromUtmp(void);

Функция

addToUtmp
принимает три аргумента. Первый,
pty
, является полным путем к добавляемому pty. Второй,
hostname
, может быть
NULL
или сетевым именем системы, из которой сетевое подключение использует этот порожденный pty (что запускает
ut_host
, рассматриваемый в следующем разделе главы). Третий,
ptyfd
, должен быть открытым файловым дескриптором, ссылающимся на устройство, названное в аргументе
pty
.

Функция

removeLineFromUtmp
принимает два аргумента; они определяются в точности как аргументы с таким же именем, передаваемые функции
addToUtmp
.

Некоторые существующие приложения записываются с помощью структуры, усложняющей хранение имени и файлового дескриптора для очистки элемента utmp. Из-за этого библиотека

utempter
поддерживает кэш самого позднего имени устройства и файлового дескриптора, передаваемого
addToUtmp
, и удобную функцию
removeFromUtmp
, не принимающую никаких аргументов и действующую как
removeLineFromUtmp
на кэшированную информацию. Это подходит только для приложений, добавляющих лишь один элемент
utmp
; более сложные приложения, использующие более одного pty, должны вместо этого применять
removeLineFromUtmp
.

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, поскольку он наиболее переносим, пока вы не используете расширения, и строго стандартизован.

  • Читать дальше
  • 1
  • ...
  • 118
  • 119
  • 120
  • 121
  • 122
  • 123
  • 124
  • 125
  • 126
  • 127
  • 128
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

Подпишитесь на рассылку: