在各种程序中都观察到以下代码序列:
dup2(fd, 0);
dup2(fd, 1);
dup2(fd, 2);
if(fd > 2)
close(fd);
我不明白为什么需要if测试。假设fd为3,那么我们只有4个文件描述符0,1,2,3指向文件表中的相同条目。这是一个问题吗?
答案 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()
,或者它可能会再次重定向标准流。在这种情况下,我们不只是泄漏文件描述符而是整个打开的文件。这是一件坏事。