处理utmp,wtmp,btmp文件的接口函数-----getutent()、 getutid()、...

#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被设置
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值