所以我必须创建一个程序,执行结果类似于使用命令who和我在linux中的人之后的执行结果。问题是if中的两个函数(strcmp ...和in else ......在分离时都有效。
主要问题是我必须将它们都放在一个文件中,它只是不起作用。当只放在那里做某事./program am i,而./program告诉Segmentation fault(core dumped)。
第二个问题是我不知道如何参与./program am我工作正常它应该只返回给我:用户pts / 0日期时间...并非所有用户都喜欢in else ... part。
#include <stdio.h>
#include <utmp.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdlib.h>
#include <time.h>
#include <string.h>
#include <sys/types.h>
#define SHOWHOST
void show_info_who( struct utmp *utbufp )
{
if(utbufp->ut_type > 4){
time_t czas = utbufp->ut_time;
char buf[80];
struct tm* timeinfo = localtime(&czas);
printf("%-8.8s", utbufp->ut_name);
printf(" ");
printf("%-8.8s", utbufp->ut_line);
printf(" ");
strftime(buf, 80, "%F %R" , timeinfo);
printf("%s", buf);
printf(" ");
#ifdef SHOWHOST
printf("(%s)", utbufp->ut_host);
#endif
printf("\n");
}
}
int main(int argc, char *argv[])
{
struct utmp current_record;
int utmpfd;
int reclen = sizeof(current_record);
if ( (utmpfd = open(UTMP_FILE, O_RDONLY)) == -1 ){
perror( UTMP_FILE );
exit(1);
}
if(strcmp ( argv[1], "am") == 0){
if(strcmp ( argv[2], "i") == 0){
while ( read(utmpfd, ¤t_record, reclen) == reclen )
show_info_who(¤t_record);
printf("test\n");
}
close(utmpfd);
return 0;
}
while ( read(utmpfd, ¤t_record, reclen) == reclen )
show_info_who(¤t_record);
close(utmpfd);
return 0;
}
答案 0 :(得分:0)
为什么不尝试使用
void setutent(void); // for rewinding
struct utmp *getutent(void);
不建议直接打开并寻求utmp文件。 utmp文件似乎是一个可以自由访问的普通文件,但它的行为类似于数据库。