struct utmp *getutent(void);
struct utmp *getutid(struct utmp *ut);
struct utmp *getutline(struct utmp *ut);
struct utmp *pututline(struct utmp *ut);
void setutent(void);
void endutent(void);
void utmpname(const char *file);
setutent() переносит указатель начало файла utmp. Вообще оптимальным вариантом считается вызывать эту функцию перед вызовом остальных.
endutent() закрывает файл utmp. Она должна быть вызвана, когда будет завершена работа с файлом посредством других функций.
getutent() считывает строку, начиная с текущей позиции файла в файле utmp. Возвращает указатель на структуру, содержащую поля этой строки.
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() добавит запись к концу файла.
#include <string.h>
#include <stdlib.h>
#include <pwd.h>
#include <unistd.h>
#include <utmp.h>
int main(int argc, char *argv[])
{
struct utmp entry;
system("echo перед добавлением записи:;who");
entry.ut_type=USER_PROCESS;
entry.ut_pid=getpid();
strcpy(entry.ut_line,ttyname(0)+strlen("/dev/"));
/* справедливо только для ptys с именами /dev/tty[pqr][0-9a-z] */
strcpy(entry.ut_id,ttyname(0)+strlen("/dev/tty"));
time(&entry.ut_time);
strcpy(entry.ut_user,getpwuid(getuid())->pw_name);
memset(entry.ut_host,0,UT_HOSTSIZE);
entry.ut_addr=0;
setutent();
pututline(&entry);
system("echo после добавления записи:;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 после удаления записи:;who");
endutent();
return 0;
}
В системах XPG2 и SVID2 функция pututline() возвращает тип void (такое поведение можно встретить и в системах AIX, HPUX, Linux libc5). В HPUX описана новая функция _pututline() с прототипом приведенным выше для pututline() (также она есть и в Linux libc5).
Эти функции являются устаревшими в не-Linux системах. POSIX 1003.1-2001, в соответствие с XPG4.2, не содержит эти функции, вместо них он использует
#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);
Структура utmpx это набор структур utmp с дополнительными полями и более широкими существующими полями. Соответствующие файлы /var/*/utmpx и /var/*/wtmpx.
Linux glibc не использует utmpx, так как структура utmp и так очень большая. Функции getutxent и т.д. являются псевдонимами getutent.
|
Закладки на сайте Проследить за страницей |
Created 1996-2025 by Maxim Chirkov Добавить, Поддержать, Вебмастеру |