我偶然发现了我正在制作的一个程序中的一个问题。以下是我的问题:
#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()
失败?
答案 0 :(得分:5)
fdopendir()
的{{3}}说:
在调用closedir()时,应关闭文件描述符。
因此,在您调用openat()
时,描述符很可能会被关闭。
这是POSIX description fdopendir():
成功调用fdopendir()后,fd由内部使用 实现,不应由应用程序使用。