#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);
------
utmp文件中的结构体及其相关信息的详细定义如下:
/* Values for ut_type field, below */
/*ut_type的值和其含义*/
#define EMPTY 0 /* Record does not contain valid info(formerly known as UT_UNKNOWN on Linux) */
#define RUN_LVL 1 /* Change in system run-level (seeinit(8)) */
#define BOOT_TIME 2 /* Time of system boot (in ut_tv) */
#define NEW_TIME 3 /* Time after system clock change(in ut_tv) */
#define OLD_TIME 4 /* Time before system clock change(in ut_tv) */
#define INIT_PROCESS 5 /* Process spawned by init(8) */
#define LOGIN_PROCESS 6 /* Session leader process for user login */
/*用户登入时创建的会话的进程组组长*/
#define USER_PROCESS 7 /* Normal process */
/*正常进程*/
#define DEAD_PROCESS 8 /* Terminated process */
/*终止进程*/
#define ACCOUNTING 9 /* Not implemented */
#define UT_LINESIZE 32
#define UT_NAMESIZE 32
#define UT_HOSTSIZE 256
struct exit_status { /* Type for ut_exit, below */
short int e_termination; /* Process termination status */
short int e_exit; /* Process exit status */
};
struct utmp {
short ut_type; /* Type of record */
/*记录类型*/
pid_t ut_pid; /* PID of login process */
/*登入进程的PID*/
char ut_line[UT_LINESIZE]; /* Device name of tty - "/dev/" */
char ut_id[4]; /* Terminal name suffix, or inittab(5) ID */
char ut_user[UT_NAMESIZE]; /* Username */
/*用户名*/
char ut_host[UT_HOSTSIZE]; /* Hostname for remote login, or kernel version for run-level messages */
/*远程登入的主机名*/
struct exit_status ut_exit; /* Exit status of a process marked as DEAD_PROCESS; not used by Linux init (1 */
/*标记是DEAD_PROCESS的进程退出时的状态*/
/* The ut_session and ut_tv fields must be the same size when compiled 32- and 64-bit. This allows data files and shared memory to be shared between 32- and 64-bit applications. */
#if __WORDSIZE == 64 && defined __WORDSIZE_COMPAT32 int32_t ut_session; /* Session ID (getsid(2)), used for windowing */
struct {
int32_t tv_sec; /* Seconds */
int32_t tv_usec; /* Microseconds */
} ut_tv; /* Time entry was made */
#else
long ut_session; /* Session ID */
/*会话id*/
struct timeval ut_tv; /* Time entry was made */
/*登入时间记录*/
#endif
int32_t ut_addr_v6[4]; /* Internet address of remote host; IPv4 address uses just ut_addr_v6[0] */
/*记录登入的远程主机地址,ipv4类型地址仅使用数组的第一个元素记录*/
char __unused[20]; /* Reserved for future use */
};
/* Backward compatibility hacks */
#define ut_name ut_user
#ifndef _NO_UT_TIME
#define ut_time ut_tv.tv_sec
#endif
#define ut_xtime ut_tv.tv_sec
#define ut_addr ut_addr_v6[0]
------
int utmpname(const char *file);
描述:设置内容格式为utmp的文件的文件名,以供后续的其他接口函数对其访问。如果在调用这个函数之前调用了其他对utmp文件操作的函数,则操作的文件将由_PATH_UTMP指定,这个宏定义在<paths.h>中。
参数:
const char *file:需要被设置的文件名
返回值:
0,表示设置成功
-1,表示设置失败,errno被设置
------
void setutent(void);
描述:将指定的utmp文件的文件指针移动到文件的开始,在调用其他操作utmp文件的接口函数之前,先调用该函数。
参数:无
返回值:无
------
void endutent(void);
描述:关闭utmp文件,在用户不再访问utmp文件的时候一定要调用该函数。
参数:无
返回值:无
------
struct utmp *getutent(void);
描述:从文件指针当前的位置开始,读取一个utmp结构体长度的内容。
参数:无
返回值:
成功,返回读取到的数据的起始地址(这个地址是在静态存储区的,所以每次调用返回的地址都是一样的,但是地址上的内容会被后续的调用所覆盖)
失败,返回NULL,errno被设置
------
struct utmp *getutid(const struct utmp *ut);
描述:根据ut提供的信息,从utmp文件的文件指针的当前位置,向上查找符合条件的结构体。如果ut->ut_type 是 RUN_LVL,BOOT_TIME,NEW_TIME,OLD_TIME,那么该函数将会根据ut_type,来查找匹配的结构体;如果ut->ut_type 是INIT_PROCESS,LOGIN_PROCESS,USER_PROCESS, DEAD_PROCESS,该函数将会根据ut_id来查找匹配的结构体
参数:
const struct utmp *ut:需要查找的结构体的地址
返回值:
成功,返回查找到的结构体的首地址
失败,返回NULL,errno被设置
-----
struct utmp *getutline(const struct utmp *ut);
描述:从utmp文件的文件指针的当前位置开始向下查找,只匹配ut_type为USER_PROCESS,LOGIN_PROCESS,并返回第一个ut_line相匹配的结构体的地址。
参数:
const struct utmp *ut:需要查找的结构体
返回值:
成功,查找到的结构体的首地址
失败,返回NULL,且errno被设置
------
struct utmp *pututline(const struct utmp *ut);
描述:使用getutid函数在utmp文件中,查找对应的结构体,并写入,如果找不到,就会在utmp文件的末尾插入。
参数:需要插入到utmp文件中的结构体
返回值:
成功,返回插入的结构体的首地址
失败,返回null,errno被设置
处理utmp,wtmp,btmp文件的接口函数-----getutent()、 getutid()、...
最新推荐文章于 2023-06-01 00:40:19 发布