我偶然發現了一個正在處理的程序中的問題。下面再現我的問題:調用fdopendir()破壞文件描述符
#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()
,已通過preceeded fdopendir()
,失敗:Bad file descriptor
。但是,如果省略fdopendir()
,則不會發生這種情況。
我知道fdopendir()
使內部使用的文件描述符,但它不應該在調用closedir()
後恢復對它的任何更改嗎?
如何避免openat()
在這種情況下失敗?
請注意,爲避免這種情況,您只需在將文件描述符傳遞給'fdopendir之前先'dup' '。 –