Provided by: manpages-ru-dev_4.26.0-1_all 

НАИМЕНОВАНИЕ
getutent, getutid, getutline, pututline, setutent, endutent, utmpname - доступ к записям файла utmp
БИБЛИОТЕКА
Стандартная библиотека языка C (libc, -lc)
ОБЗОР
#include <utmp.h>
struct utmp *getutent(void);
struct utmp *getutid(const struct utmp *ut);
struct utmp *getutline(const struct utmp *ut);
struct utmp *pututline(const struct utmp *ut);
void setutent(void);
void endutent(void);
int utmpname(const char *file);
ОПИСАНИЕ
New applications should use the POSIX.1-specified "utmpx" versions of these functions; see STANDARDS.
Функция utmpname() задаёт имя файла в формате utmp для других функций utmp. Если utmpname() не
используется для указания имени файла перед работой с другими функциями, то они будут использовать имя из
_PATH_UTMP, определённое в <paths.h>.
Функция setutent() переносит указатель начало файла utmp. Вообще, оптимальным вариантом считается
вызывать эту функцию перед вызовом остальных.
Функция endutent() закрывает файл utmp. Она должна быть вызвана, когда будет завершена работа с файлом
посредством других функций.
Функция getutent() считывает строку, начиная с текущей позиции файла в файле utmp. Она возвращает
указатель на структуру, содержащую поля этой строки. Определение структуры приведено в utmp(5).
Функция getutid() производит прямой поиск, начиная с текущей позиции файла в файле utmp, основываясь на
данных ut. Если значение ut->ut_type равно RUN_LVL, BOOT_TIME, NEW_TIME или OLD_TIME, то getutid() найдёт
первую запись, поле ut_type которой совпадает с ut->ut_type. Если ut->ut_type равно INIT_PROCESS,
LOGIN_PROCESS, USER_PROCESS или DEAD_PROCESS, то getutid() найдёт первую запись, поле ut_id которой
совпадает с ut->ut_id.
Функция getutline() производит прямой поиск, начиная с текущей позиции файла в файле utmp. Она
просматривает записи, у которых поле ut_type совпадает с USER_PROCESS или LOGIN_PROCESS, и возвращает
первую запись, поле ut_line которой совпадает с ut->ut_line.
Функция pututline() записывает структуру utmp ut в файл utmp. Для поиска места в файле, необходимого для
вставки новой записи, используется getutid() . Если такое место не найдено, то pututline() добавит запись
в конец файла.
ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
При успешном выполнении функции getutent(), getutid() и getutline() возвращают указатель на struct utmp и
NULL при ошибке (к ним относится и случай «запись не найдена»). Структура struct utmp располагается в
статическом хранилище и может быть изменена последующими вызовами.
При успешном выполнении pututline() возвращает ut; при ошибке возвращается NULL.
При успешном назначении нового имени функция utmpname() возвращает 0 и -1 при ошибке.
On failure, these functions errno set to indicate the error.
ОШИБКИ
ENOMEM Не хватает памяти.
ESRCH Запись не найдена.
Функции setutent(), pututline() и getut*() также могут завершиться с ошибкой по причинам, описанным в
open(2).
ФАЙЛЫ
/var/run/utmp
база данных пользователей, находящихся в системе в данный момент
/var/log/wtmp
база данных предыдущих пользовательских входов в систему
АТРИБУТЫ
Описание терминов данного раздела смотрите в attributes(7).
┌─────────────────────────┬──────────────────────┬──────────────────────────────────────────────────────┐
│ Интерфейс │ Атрибут │ Значение │
├─────────────────────────┼──────────────────────┼──────────────────────────────────────────────────────┤
│ getutent() │ Безвредность в нитях │ MT-Unsafe init race:utent race:utentbuf sig:ALRM │
│ │ │ timer │
├─────────────────────────┼──────────────────────┼──────────────────────────────────────────────────────┤
│ getutid(), getutline() │ Безвредность в нитях │ MT-Unsafe init race:utent sig:ALRM timer │
├─────────────────────────┼──────────────────────┼──────────────────────────────────────────────────────┤
│ pututline() │ Безвредность в нитях │ MT-Unsafe race:utent sig:ALRM timer │
├─────────────────────────┼──────────────────────┼──────────────────────────────────────────────────────┤
│ setutent(), endutent(), │ Безвредность в нитях │ MT-Unsafe race:utent │
│ utmpname() │ │ │
└─────────────────────────┴──────────────────────┴──────────────────────────────────────────────────────┘
В приведённой выше таблице utent в race:utent означает, что если в нескольких нитях программы
одновременно используются функции setutent(), getutent(), getutid(), getutline(), pututline(), utmpname()
или endutent(), то может возникнуть состязательность по данным.
СТАНДАРТЫ
Отсутствуют.
ИСТОРИЯ
XPG2, SVr4.
Согласно XPG2 и SVID 2 функция pututline() возвращает тип void и такое поведение можно встретить во
многих системах (AIX, HP-UX). В HP-UX представлена новая функция _pututline() с прототипом приведённым
выше для pututline().
Эти функции являются устаревшими в не Linux системах. POSIX.1-2001 и POSIX.1-2008, следуя SUSv1, не
содержит эти функции, вместо них используются
#include <utmpx.h>
struct utmpx *getutxent(void);
struct utmpx *getutxid(const struct utmpx *);
struct utmpx *getutxline(const struct utmpx *);
struct utmpx *pututxline(const struct utmpx *);
void setutxent(void);
void endutxent(void);
Эти функции предоставляются glibc и выполняют те же задачи что и их аналоги без «x»", но используют
struct utmpx, определённую в Linux подобно struct utmp. Для завершённости, в glibc также есть
utmpxname(), хотя эта функция отсутствует в POSIX.1.
В некоторых других системах структура utmpx представляет собой utmp с дополнительными полями и
увеличенными размерами одинаковых полей, а также параллельно обслуживаются обе версии файлов, часто
/var/*/utmpx и /var/*/wtmpx.
С другой стороны, в Linux glibc не используется второй файл utmpx, так как её структура utmp имеет
достаточный размер. Функции с «x», перечисленные выше, являются просто псевдонимами их аналогов без «x»
(например, getutxent() псевдоним getutent()).
ПРИМЕЧАНИЯ
Замечания по glibc
The above functions are not thread-safe. glibc adds reentrant versions
#include <utmp.h>
int getutent_r(struct utmp *ubuf, struct utmp **ubufp);
int getutid_r(struct utmp *ut,
struct utmp *ubuf, struct utmp **ubufp);
int getutline_r(struct utmp *ut,
struct utmp *ubuf, struct utmp **ubufp);
Требования макроса тестирования свойств для glibc (см. feature_test_macros(7)):
getutent_r(), getutid_r(), getutline_r():
_GNU_SOURCE
|| /* Since glibc 2.19: */ _DEFAULT_SOURCE
|| /* glibc <= 2.19: */ _SVID_SOURCE || _BSD_SOURCE
Эти функции являются расширениями GNU, они аналогичны функциям с тем же именем без суффикса _r. В
аргумент ubuf, передаваемый этим функциям, помещается результат. При успешном выполнении они возвращают 0
и указатель на результат записывается в *ubufp. При ошибке эти функции возвращают -1. Среди этих функций
отсутствует эквиваленты utmpx (в POSIX.1 такие функции отсутствуют).
ПРИМЕРЫ
Нижеследующий пример добавляет и удаляет запись utmp, предполагается, что программа запущена с
псевдотерминала. Для использования в реальном приложении необходимо проверять значения, возвращаемые
getpwuid(3) и ttyname(3).
#include <pwd.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <unistd.h>
#include <utmp.h>
int
main(void)
{
struct utmp entry;
system("echo before adding entry:;who");
entry.ut_type = USER_PROCESS;
entry.ut_pid = getpid();
strcpy(entry.ut_line, ttyname(STDIN_FILENO) + strlen("/dev/"));
/* only correct for ptys named /dev/tty[pqr][0-9a-z] */
strcpy(entry.ut_id, ttyname(STDIN_FILENO) + strlen("/dev/tty"));
entry.ut_time = time(NULL);
strcpy(entry.ut_user, getpwuid(getuid())->pw_name);
memset(entry.ut_host, 0, UT_HOSTSIZE);
entry.ut_addr = 0;
setutent();
pututline(&entry);
system("echo after adding entry:;who");
entry.ut_type = DEAD_PROCESS;
memset(entry.ut_line, 0, UT_LINESIZE);
entry.ut_time = 0;
memset(entry.ut_user, 0, UT_NAMESIZE);
setutent();
pututline(&entry);
system("echo after removing entry:;who");
endutent();
exit(EXIT_SUCCESS);
}
СМОТРИТЕ ТАКЖЕ
getutmp(3), utmp(5)
ПЕРЕВОД
Русский перевод этой страницы руководства разработал(и) Azamat Hackimov <azamat.hackimov@gmail.com>,
Dmitry Bolkhovskikh <d20052005@yandex.ru>, Vladislav <ivladislavefimov@gmail.com>, Yuri Kozlov
<yuray@komyakino.ru>, Иван Павлов <pavia00@gmail.com> и Kirill Rekhov <krekhov.dev@gmail.com>
Этот перевод является свободной программной документацией; он распространяется на условиях общедоступной
лицензии GNU (GNU General Public License - GPL, https://www.gnu.org/licenses/gpl-3.0.html версии 3 или
более поздней) в отношении авторского права, но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ.
Если вы обнаружите какие-либо ошибки в переводе этой страницы руководства, пожалуйста, сообщите об этом
разработчику(ам) по его(их) адресу(ам) электронной почты или по адресу списка рассылки русских
переводчиков.
Справочные страницы Linux 6.9.1 2 мая 2024 г. getutent(3)