不使用fopen()和fread()读取linux utmp文件

时间:2014-10-13 05:14:35

标签: c linux file

我试图在Linux中打开utmp文件并将内容读入一个utmp结构数组。之后,我显示数组中每个结构的ut_user和ut_type。当我使用File *file打开文件并使用fopen()fread()函数时,我有这个工作,但当我尝试使用文件描述符int file执行相同的任务时open()read()函数在尝试访问utmp结构的成员时获取地址位置。

所以在下面的程序中你可以看到我注释掉了三行代码,我可以用它来成功执行将utmp文件读入utmp结构数组并打印出两个成员值的任务。但是,当我尝试使用三行代码(表示为“new way”)代替旧方法时,我会得到一堆地址位置,而不是ut_user和{{的值。 1}}。

ut_id

以下是工作方式的一些输出:

enter image description here

以下是新方法无效的输出:

enter image description here

我尝试在线查找有关此事的更多信息,但我似乎无法找到任何使用文件描述符而不是 #include <unistd.h> #include <sys/stat.h> #include <fcntl.h> #include <stdlib.h> #include <stdio.h> #include <string.h> #include <utmp.h> void utmpprint(struct utmp *log) { printf("\n ut_user: %s \n ut_type: %ld \n", log->ut_user, log->ut_type); } int main() { int logsize = 10; //FILE *file; //Working way int file; //New way struct utmp log[logsize]; int i = 0; //file = fopen("/var/run/utmp", "rb"); //Working way file = open("/var/run/utmp", O_RDONLY); //New way if( file < 0 ) { //New way printf("Failed to open"); return(0); } if (file) { //fread(&log, sizeof(struct utmp), logsize, file); //Working way read(file, &log, logsize); //New way for(i = 0; i < logsize; i++) { utmpprint(&log[i]); } close(file); //New way } else { return(0); } return(0); } 的内容。我也尝试改变一些指针和引用,但这并没有改善任何结果。

我是C的新手,我认为我可能在这种情况下错误地使用File函数,因为当我认为我应该以某种方式将read()函数传递给读取函数时{} 1}}。

1 个答案:

答案 0 :(得分:4)

您没有从文件中读取足够的数据。

read(file, &log, logsize);

应该是:

read(file, &log, sizeof(log));
// or
read(file, &log, logsize * sizeof (struct utmp));

此外,在这两种情况下,都应检查返回值以查看实际读取的字节数。