我试图在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
以下是工作方式的一些输出:
以下是新方法无效的输出:
我尝试在线查找有关此事的更多信息,但我似乎无法找到任何使用文件描述符而不是 #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}}。
答案 0 :(得分:4)
您没有从文件中读取足够的数据。
read(file, &log, logsize);
应该是:
read(file, &log, sizeof(log));
// or
read(file, &log, logsize * sizeof (struct utmp));
此外,在这两种情况下,都应检查返回值以查看实际读取的字节数。