【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;
}