39.1. Измените программу из листинга 35.2 (sched_set.c) так, чтобы она могла задействовать возможности файла и выполняться от имени непривилегированного пользователя.
40. Учет входа в систему
Механизм учета входа в систему занимается записью сведений о том, какие пользователи сейчас находятся в системе, а также о предыдущих входах и выходах. В данной главе мы рассмотрим файлы, хранящие эти данные, и библиотечные функции, позволяющие обновлять и получать их содержимое. Также будет пошагово описана процедура обновления этих файлов, которую должно выполнять приложение, отвечающее за вход пользователей в систему (и выход из нее).
В UNIX-системах имеются два файла, содержащих информацию о входе пользователей в систему и их выходе из нее.
• Файл utmp хранит записи о пользователях, находящихся в системе в текущий момент времени (а также некую дополнительную информацию, о которой мы поговорим чуть позже). При каждом входе в систему в этот файл добавляется новая запись. Одно из его полей, ut_user, содержит имя пользователя. Во время выхода из системы данное поле очищается. Такие программы, как who(1), используют содержимое файла utmp для вывода списка пользователей, находящихся в системе.
• Файл wtmp представляет собой учетный журнал с информацией обо всех входах в систему и выходах из нее (плюс ряд дополнительных сведений, речь о которых пойдет чуть позже). При каждом входе в систему в этот файл добавляется та же запись, что и в utmp. При выходе добавляется еще одна запись с тем же содержимым, но с обнуленным полем ut_user. Данные, хранящиеся в файле wtmp, можно просматривать и фильтровать с помощью команды last(1).
В Linux файлы utmp и wtmp имеют пути /var/run/utmp и, соответственно, /var/log/wtmp. В целом, программу не должно заботить ее местоположение, так как информация о нем заложена в библиотеку glibc. Если вам все же нужно получить эти пути, то лучше не указывать их напрямую в своем коде, а воспользоваться константами _PATH_UTMP и _PATH_WTMP, объявленными в заголовочном файле
Стандарт SUSv3 не предусматривает никаких символьных обозначений для путей к файлам utmp и wtmp. В Linux и BSD используются имена _PATH_UTMP и _PATH_WTMP, однако во многих других реализациях UNIX вместо этого определены константы UTMP_FILE и WTMP_FILE. Кроме того, в Linux указанные значения хранятся только в файле
Файлы utmp и wtmp присутствуют в системе UNIX с давних пор. За это время они постепенно эволюционировали и претерпели различные изменения на разных платформах — особенно заметна разница между BSD и System V. В System V Release 4 значительно расширился программный интерфейс, в результате чего появилась новая (параллельная) структура utmpx, а также связанные с ней файлы utmpx и wtmpx. Функции, предназначенные для работы с ними, тоже имеют в своих названиях букву x, равно как и связанные с ними заголовочные файлы. Подобные нестандартные расширения этого программного интерфейса появились и во многих других реализациях UNIX.
В данной главе будет описана Linux-версия интерфейса utmpx, которая представляет собой смесь реализаций, входящих в состав систем BSD и System V. В отличие от последней Linux не создает параллельных файлов utmpx и wtmpx; вместо этого вся необходимая информация записывается в файлы utmp и wtmp. Но, чтобы сохранить совместимость с другими реализациями, для доступа к этим файлам Linux предоставляет сразу два программных интерфейса — традиционный utmp и utmpx, пришедший из System V. Оба они возвращают одни и те же данные (одно из немногих различий между этими интерфейсами заключается в том, что utmp содержит несколько реентерабельных функций). Однако здесь будет описан только интерфейс utmpx, так как он входит в стандарт SUSv3 и благодаря своей портируемости на другие системы является более предпочтительным.
Спецификация SUSv3 не покрывает все аспекты программного интерфейса utmpx (например, в ней не указано местоположение файлов utmp и wtmp). Содержимое файлов учета входа в систему зависит от конкретной реализации, а в ряде систем utmpx может поддерживать дополнительные функции, не предусмотренные стандартом SUSv3.
В главе 17 книги [Frisch, 2002] перечислены некоторые отличия в местоположении и применении файлов wtmp и utmp в разных реализациях UNIX. Там же можно найти описание работы с командой ac(1), позволяющей выводить информацию о входе в систему, хранящуюся в файле wtmp.
Каждая запись в файлах utmp и wtmp представляет собой структуру utmpx, объявленную в заголовочном файле