4个文件描述符可以指向同一个文件表条目

时间:2014-11-13 19:07:14

标签: unix

在各种程序中都观察到以下代码序列:

dup2(fd, 0);
dup2(fd, 1);
dup2(fd, 2);

if(fd > 2)
 close(fd);

我不明白为什么需要if测试。假设fd为3,那么我们只有4个文件描述符0,1,2,3指向文件表中的相同条目。这是一个问题吗?

2 个答案:

答案 0 :(得分:0)

  

我不明白为什么需要if测试。假设fd为3,那么我们只有4个文件描述符0,1,2,3指向文件表中的相同条目。这是一个问题吗?

假设fd为0,1或2.如果没有测试,将关闭STDIN,STDOUT或STDERR之一。此代码尝试确保将IN / OUT / ERR映射到已知文件 - 可能是重定向到/dev/null打开的O_RDWR - 以便以后的读/写不会受挫(EBADF),或者更糟糕的是,发送到“错误的”fd。

或者假设完全省略close。如果fd为3或更大,则该文件描述符可能泄漏(由子进程继承),即使IN / OUT / ERR在exec之前被复制,也允许访问我们不能访问的资源我希望孩子拥有。

答案 1 :(得分:0)

  

假设fd为3,那么我们只有4个文件描述符0,1,2,3指向文件表中的相同条目。这是一个问题吗?

可能。

由于标准流指向打开的文件,因此泄漏文件描述符可能没问题,因为无论如何,在进程关闭之前,基础文件描述可能不会被关闭。它确实是草率的,但它实际上不会引起问题。

但这有点乐观。也许该程序将调用fork()和/或exec(),或者它可能会再次重定向标准流。在这种情况下,我们不只是泄漏文件描述符而是整个打开的文件。这是一件坏事。