【发布时间】:2014-10-13 05:14:35
【问题描述】:
我正在尝试在 Linux 中打开 utmp 文件并将其内容读入 utmp 结构数组。之后,我显示数组中每个结构的 ut_user 和 ut_type。当我使用File *file 打开文件并使用fopen() 和fread() 函数时,我可以正常工作,但是当我尝试仅使用文件描述符int file 和open() 和read() 执行相同的任务时函数我在尝试访问 utmp 结构的成员时获取地址位置。
所以在下面的程序中,您可以看到我注释掉了三行代码,我可以使用它们一起成功地执行将 utmp 文件读入 utmp 结构数组并打印出它们的两个成员值的任务。但是,当我尝试用三行代码(表示为“新方式”)代替旧的方式做完全相同的事情时,我得到了一堆地址位置,而不是ut_user 和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);
}
这是工作方式的一些输出:
这是无效的新方法的输出:
我尝试在网上查找有关此问题的更多信息,但我似乎找不到任何使用文件描述符而不是 File 的内容。我还尝试更改一些指针和引用,但这并没有改善任何结果。
我对 C 语言非常陌生,我认为在这种情况下我可能错误地使用了 read() 函数,因为当我认为应该以某种方式将 utmp structure array 传递给 read 函数时,我正在将一个简单的缓冲区传递给它。
【问题讨论】:
-
file = file = open("/var/run/utmp", O_RDONLY);?那是错字吗?当您改为file = open("/var/run/utmp", O_RDONLY);时有什么变化吗?此外,您对"success" 的检查应为if (file >= 0) { ... }。