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中
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值