0
#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 节点号相同。

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

buf 如果我使用函数 fstat,st_ino 始终是 4195126。

谁能告诉我为什么会这样?

4

1 回答 1

2

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

正如 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: %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;
}
于 2016-05-10T10:13:41.670 回答