调用fdopendir()会破坏文件描述符

时间:2015-06-13 21:17:10

标签: c linux

我偶然发现了我正在制作的一个程序中的一个问题。以下是我的问题:

#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()失败?

1 个答案:

答案 0 :(得分:5)

fdopendir()的{​​{3}}说:

  

在调用closedir()时,应关闭文件描述符。

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

这是POSIX description fdopendir():

  

成功调用fdopendir()后,fd由内部使用   实现,不应由应用程序使用。