#include "stdio.h"
#include <sys/stat.h>
int
main(int argc, char *argv[]) {
struct stat buf;
//int fd = open("./fstatat.c", "r");
//int fd2 = fstatat(fd, "a.txt", &buf, 0);
//printf("%dn", buf.st_ino);
stat("./fstatat.c", &buf);
printf("%dn", buf.st_ino);
return 0;
}
如果我使用函数 stat 来获取结构 stat,则st_ino与带有 ls -i 的 i 节点编号相同。
1305609
[inmove@localhost chapter-four]$ ls -i
1305607 a.txt 1305606 fstatat.bin 1305609 fstatat.c 1305605 tmp.txt
BUF 如果我使用函数 FSTAT,则st_ino始终是4195126。
谁能告诉我为什么会这样?
问题是您没有正确使用open
并且没有检查返回值是否存在错误。因此,然后您正在调用无效的文件描述符值fstat
-1
由 open
在错误时返回,该值也将失败并且根本不会触及buf
,因此结构中未初始化的垃圾仍然存在(4195126
,十六进制0x400336
闻起来很像仍在堆栈上的先前函数调用的返回地址或类似的东西。
正如 davmac 已经指出的那样,要open
的第二个参数必须是数字标志列表。查看文档。
因此,正确的代码是:
#include "stdio.h"
#include <sys/stat.h>
#include <sys/fcntl.h> // for the O_RDONLY constant
#include <errno.h> // for error output
int main(int argc, char *argv[]) {
struct stat buf;
int fd = open("./fstatat.c", O_RDONLY);
if(fd == -1) {
printf("Error calling open: %sn", strerror(errno));
} else {
if(fstat(fd, &buf) == -1) {
printf("Error calling fstat: %sn", strerror(errno));
} else {
printf("%dn", buf.st_ino);
if(close(fd) == -1) {
printf("Error calling close: %sn", strerror(errno));
}
}
}
return 0;
}