我在正在研究的程序中偶然发现一个问题。以下重现了我的问题:

#include <stdlib.h>
#include <stdio.h>
#include <errno.h>

#include <sys/types.h>
#include <dirent.h>
#include <fcntl.h>
#include <sys/stat.h>

int main(int argc, char *argv[])
{
    int fd, ret_fd;
    DIR *dirp;
    fd = open("./", O_RDONLY);

#if 1
    if ((dirp = fdopendir(fd)) == NULL) {
        perror("dirp");
        return 1;
    }
    closedir(dirp);
#endif

    ret_fd = openat(fd, "Makefile", O_RDONLY);
    if (ret_fd == -1) {
        perror("ret_fd");
        return 1;
    }
    return 0;

}

基本上,以openat()开头的对fdopendir()的调用失败,并带有:Bad file descriptor。但是,如果省略fdopendir(),则不会发生这种情况。

我知道fdopendir()在内部使用了文件描述符,但是在调用closedir()之后,它不应该对它进行任何更改吗?

在这种情况下,如何防止openat()失败?

最佳答案

fdopendir()POSIX description说:



因此,在您调用openat()时,描述符可能已关闭。

这是来自a typical Linux man pagefdopendir():

09-08 01:43