自己用C语言编写who命令


                                                                 学习时间:2013/8/12

#include

#include

#include

#include

int main()

{

struct utmp *p_utent;

long t;

setutent();

while((p_utent = getutent()) != NULL){

//getutent()每次读一个struct utmp结构体

if(p_utent->ut_type != USER_PROCESS)

continue;

printf("%s\t", p_utent->ut_user);

printf("%s\t", p_utent->ut_line);

t = p_utent->ut_tv.tv_sec;

printf("%.20s\t", ctime(&t) + 4);

printf("(%s)\n", p_utent->ut_host);

}

endutent();

return 0;

}

/var/run/utmp -- database of currently logged-in users

/var/log/wtmp -- database of past user logins

(utmp文件中保存的是当前正在本系统中的用户的信息。wtmp文件中保存的是登录过本系统的用户的信息)

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

struct exit_status

{

short int e_termination;

short int e_exit;

};

struct utmp

{

short int ut_type;

pid_t ut_pid;

char ut_line[UT_LINESIZE];

char ut_id[4];

char ut_user[UT_NAMESIZE];

char ut_host[UT_HOSTSIZE];

struct exit_status ut_exit;

#if __WORDSIZE == 64 && defined __WORDSIZE_COMPAT32

int32_t ut_session;

struct

{

int32_t tv_sec;

int32_t tv_usec;

} ut_tv;

#else

long int ut_session;

struct timeval ut_tv;

#endif

int32_t ut_addr_v6[4];

char __unused[20];

};

#define EMPTY 0

#define RUN_LVL 1

#define BOOT_TIME 2

#define NEW_TIME 3

#define OLD_TIME 4

#define INIT_PROCESS 5

#define LOGIN_PROCESS 6

#define USER_PROCESS 7

#define DEAD_PROCESS 8

#define ACCOUNTING 9

而读取和修改这些文件的函数如下:

#include

struct utmp *getutent(void);

//函数从文件utmp中,每次读取一个struct utmp的结构体。读取失败返回NULL

struct utmp *getutid(struct utmp *ut);

struct utmp *getutline(struct utmp *ut);

struct utmp *pututline(struct utmp *ut);

void setutent(void);// 函数打开文件utmp,并且将文件指针指向文件的最开始

void endutent(void);// 函数关闭文件utmp

int utmpname(const char *file);

utmpname()函数设定utmp文件所在的路径,默认的路径为宏 _PATH_UTMP,该宏定义在/usr/include/paths.h中:

#define _PATH_UTMP "/var/run/utmp"

pututline() //函数将一个struct utmp结构体写进文件utmp中

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值