C语言中操作utmp文件的相关函数用法
C语言getutent()函数:从utmp文件中取得账号登录数据
头文件:
#include<utmp.h>
定义函数:
structutmp*getutent(void);
函数说明:getutent()用来从utmp文件(/var/run/utmp)中读取一项登录数据,该数据以utmp结构返回.第一次调用时会取得第一位用户数据,之后每调用一次就会返回下一项数据,直到已无任何数据时返回NULL。
utmp结构定义如下:
structutmp { shortintut_type;//登录类型 pid_tut_pid;//login进程的pid charut_line[UT_LINESIZE];//登录装置名,省略了"/dev/" charut_id[4];//InittabID charut_user[UT_NAMESIZE];//登录账号 charut_host[UT_HOSTSIZE];//登录账号的远程主机名称 struxtexit_statusut_exit;//当类型为DEAD_PROCESS时进程的结束状态 longintut_session;//SessiocID structtimevalut_tv;//时间记录 int32_tut_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结构定义:
structexit_status { shortinte_termination;//进程结束状态 shortinte_exit;//进程退出状态 };
timeval的结构定义请参考gettimeofday()。
相关常数定义如下:
- UT_LINESIZE32
- UT_NAMESIZE32
- UT_HOSTSIZE256
返回值:返回utmp结构数据,如果返回NULL则表示已无数据,或有错误发生.
附加说明:getutent()在第一次调用时会打开utmp文件,读取数据完毕后可使用endutent()来关闭该utmp文件.
范例
#include<utmp.h> main() { structutmp*u; while((u=getutent())) { if(u->ut_type==USER_PROCESS) printf("%d%s%s%s\n",u->ut_type,u->ut_user,u->ut_line,u->ut_host); } endutent(); }
执行
//表示有三个root账号分别登录/dev/pts/0,/dev/pts/1,/dev/pts/2
7rootpts/0
7rootpts/1
7rootpts/2
C语言setutent()函数:从头读取utmp文件中的登录数据
头文件:
#include<utmp.h>
定义函数:
voidsetutent(void);
函数说明:setutent()用来将getutent()的读写地址指回utmp文件开头。
C语言endutent()函数:关闭文件(关闭utmp文件)
头文件:
#include<utmp.h>
定义函数:
voidendutent(void);
函数说明:endutent()用来关闭由getutent所打开的utmp文件。
范例:请参考getutent().