我在正在研究的程序中偶然发现一个问题。以下重现了我的问题:
#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 page的fdopendir():