与st_ino混淆?

时间:2016-05-10 09:57:28

标签: c stat fstat

#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("%d\n", buf.st_ino);
    stat("./fstatat.c", &buf);
    printf("%d\n", buf.st_ino);
    return 0;
}

如果我使用函数stat来获取struct stat,则st_ino与具有ls -i的i-node编号相同。

1305609
[inmove@localhost chapter-four]$ ls -i
1305607 a.txt  1305606 fstatat.bin  1305609 fstatat.c  1305605 tmp.txt

如果我使用函数fstat,那么st_ino总是4195126。

任何人都可以告诉我为什么会这样?

1 个答案:

答案 0 :(得分:2)

问题是您没有正确使用open并且不检查错误的返回值。因此,您在fstat上由-1返回的无效文件描述符值open上调用buf,这也将失败并且根本不会触及4195126,因此未初始化的垃圾在结构中仍然存在(0x400336,十六进制open闻起来很像前一个函数调用的返回地址仍然在堆栈上或类似的东西。)

正如davmac已经指出的那样,#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: %s\n", strerror(errno)); } else { if(fstat(fd, &buf) == -1) { printf("Error calling fstat: %s\n", strerror(errno)); } else { printf("%d\n", buf.st_ino); if(close(fd) == -1) { printf("Error calling close: %s\n", strerror(errno)); } } } return 0; } 的第二个参数必须是一个数字列表。查看docs

所以,正确的代码是:

=List()