【发布时间】:2017-09-13 20:19:24
【问题描述】:
dup2(fd, 0);
dup2(fd, 1);
dup2(fd, 2);
if (fd > 2)
close(fd);
根据《UNIX 环境下的高级编程》一书,上面的 if 语句是必要的。这本书建议通过考虑如果 fd = 1 在一种情况下会发生什么来解决它,如果 fd = 3 在另一种情况下会发生什么。
如果 fd = 1, 0 (stdin) 将被关闭,然后将指向 stdout,1 仍将指向 stdout(因为 dup2() 不会关闭文件描述符,如果它等于第一个参数,并且会return 1) 和 2 将指向标准输出。
如果 fd = 3,每个文件描述符将首先关闭,然后指向 3 指向的任何文件。
大于2的描述符为什么要关闭?
【问题讨论】:
-
通过执行这一系列的 fd 操作,您正试图达到某种目标状态。目标状态是否包括更高 fd 上的 stdin/stdout/stderr 的额外副本?
-
@WumpusQ.Wumbley 除了问题中的代码 sn-p 以及为什么需要 if 语句的问题之外,该问题没有其他上下文。
-
你认为有任何上下文,其中一个合理的目标状态是“有时,有一个额外的文件描述符,取决于我们开始的文件描述符编号”?
-
在重复描述符 3 次之后,似乎没有额外的描述符成为一个特别紧迫的问题,所以我认为肯定还有其他问题在起作用 - 到最后,我们有 4 个描述符都指向同一个文件表条目,关闭原始有什么好处,因为仍然存在冗余?
-
@bag 我已经解释了为什么关闭未使用的描述符对我的答案很重要。
标签: linux unix gnu file-descriptor