• linux c 操作utmp 和 wtmp 文件接口


    /var/run/utmp 保存当前在本系统中的用户信息
    /var/log/wtmp 保存登陆过本系统的用户信息

    他们保存的信息是基于结构体 struct utmp 的(/usr/include/bits/utmp.h)

    utmp 结构体定义例如以下:
    struct utmp
    {
        short int ut_type; //登录类型
        pid_t ut_pid; //login 进程的pid
        char ut_line[UT_LINESIZE]; //登录装置名, 省略了"/dev/"
        char ut_id[4]; //Inittab ID
        char ut_user[UT_NAMESIZE]; //登录账号
        char ut_host[UT_HOSTSIZE]; //登录账号的远程主机名称
        struxt exit_status ut_exit; //当类型为DEAD_PROCESS 时进程的结束状态
        long int ut_session; //Sessioc ID
        struct timeval ut_tv; //时间记录
        int32_t ut_addr_v6[4]; //远程主机的网络地址
        char __unused[20]; //保留未使用
    };
    
    ut_type 有下面几种类型:
    EMPTY:此为空的记录.
    RUN_LVL:记录系统run-level 的改变
    BOOT_TIME:记录系统开机时间
    NEW_TIME:记录系统时间改变后的时间
    OLD_TINE:记录当改变系统时间时的时间.
    INIT_PROCESS:记录一个由init 衍生出来的进程.
    LOGIN_PROCESS:记录 login 进程.
    USER_PROCESS:记录一般进程.
    DEAD_PROCESS:记录一结束的进程.
    ACCOUNTING:眼下尚未使用.
    
    exit_status 结构定义:
    struct exit_status
    {
        short int e_termination; //进程结束状态
        short int e_exit; //进程退出状态
    };
    
    struct timeval 结构定义:
    struct timeval{
        time_t      tv_sec;     /* 秒数 */
        suseconds_t tv_usec;    /* 微秒 */
    };
    
    相关常数定义例如以下:
    UT_LINESIZE 32
    UT_NAMESIZE 32
    UT_HOSTSIZE 256
    

    读取和改动这些文件的函数例如以下:

    #include <utmp.h>
    struct utmp *getutent(void);  
    //从 utmp 文件里,每次读取一个 struct tump 结构体。读完文件或者失败返回NULL
    //附加说明:getutent()在第一次调用时会打开utmp 文件, 读取数据完成后可使用endutent()来关闭该utmp文件
    
    
    struct utmp *getutid(struct utmp *ut); 
    //从 utmp 文件里的读写位置逐一往后搜索參数 ut 指定的记录
    //1、假设ut->ut_type 为RUN_LVL, BOOT_TIME, NEW_TIME, OLD_TIME 当中之中的一个则查找与ut->ut_type 相符的记录;
    //2、若ut->ut_type为INIT_PROCESS, LOGIN_PROCESS, USER_PROCESS 或DEAD_PROCESS 当中之中的一个, 则查找与ut->ut_id相符的记录. 
    
    struct utmp *getutline(struct utmp *ut);
    //从utmp 文件的读写位置逐一往后搜索ut_type 为USER_PROCESS 或LOGIN_PROCESS 的记录, 并且ut_line 和ut->ut_line 相符.
    
    struct utmp *pututline(struct utmp *ut);
    //将一个struct utmp结构体写进文件utmp中
    
    void setutent(void);
    //打开文件utmp,并且将文件指针指向文件的最開始。
    
    void endutent(void);
    //关闭文件utmp
    
    int utmpname(const char *file);
    //设定utmp文件所在的路径,默认的路径为宏 _PATH_UTMP,该宏定义在/usr/include/paths.h中
  • 相关阅读:
    MyBatis 学习记录3 MapperMethod类
    MyBatis 学习记录2 Mapper对象是如何生成的
    MyBatis 学习记录1 一个简单的demo
    hadoop学习记录1 初始hadoop
    Java枚举类的serialVersionUID
    docker学习记录1
    mysql utf8方式连接查看表数据乱码的问题
    在Spring中使用Redis Lua脚本批量删除缓存
    redis 批量删除键
    前后端分离跨域问题解决方案
  • 原文地址:https://www.cnblogs.com/yjbjingcha/p/7249797.html
Copyright © 2020-2023  润新知