您的位置:首页 > 运维架构 > Linux

【C语言】实现Linux下的who命令

2016-05-17 21:19 495 查看

【C语言】实现Linux下的who命令

实现思路是读取UTMP_FILE文件,利用结构体struct utmp去获取相应的消息。

代码实现

#include <stdio.h>
#include <stdlib.h>
#include <utmp.h>
#include <fcntl.h>
#include <unistd.h>
#include <time.h>

#define SHOWHOST

void showtime(long timeval)
{
struct tm *t;

t = localtime(&timeval);

if(t->tm_mon+1 < 10)
printf("%d-0%d", t->tm_year+1900, t->tm_mon+1);
else
printf("%d-%d", t->tm_year+1900, t->tm_mon+1);

printf("-");
if(t->tm_mday+1 < 10)
printf("0%d", t->tm_mday);
else
printf("%d", t->tm_mday);

printf(" ");

if(t->tm_hour<10)
printf("0%d", t->tm_hour);
else
printf("%d", t->tm_hour);

printf(":");

if(t->tm_min<10)
printf("0%d", t->tm_min);
else
printf("%d", t->tm_min);
}

void show_info(struct utmp * uBuf)
{
if(uBuf->ut_type != USER_PROCESS)
return;
printf("%-8.8s", uBuf->ut_name);
printf(" ");
printf("%-8.8s", uBuf->ut_line);
printf("     ");

showtime(uBuf->ut_time);

printf(" ");
#ifdef SHOWHOST
printf("(%s)", uBuf->ut_host);
printf(" ");
#endif
printf("\n");
}

int main(void)
{
struct utmp current_record;
int utmpfd;
int reclen = sizeof(current_record);

if( (utmpfd = open(UTMP_FILE, O_RDONLY)) == -1 )
{
printf("open file error\n");
exit(1);
}

while(read(utmpfd, ¤t_record, reclen) == reclen)
show_info(¤t_record);

close(utmpfd);

return 0;
}


效果

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  linux c语言 who