当我们使用dup将STDOUT重定向到管道时,我们会:
close(1); dup(fd[1]);
close(fd[0]);
close(fd[1]);
execlp("ls","-al",(char *) NULL);
但我们要把管子的两端都关上。那么如何将STDOUT写入管道呢?
最佳答案
在示例代码中,您没有关闭管道的两端。你正在关闭fd[0]
和fd[1]
。最初,关闭它们就足以关闭管道的两端,但复制fd[0]
之后就不会了。您还必须关闭复制的fd才能关闭对管道的所有引用。不过,这是很愚蠢的:你要保持一个完全开放的结尾,以便ls可以写信给。
也许你的困惑是close()
要关门了?它关闭fd,即对管道一端的引用。它不会关闭管道本身:这就是shutdown()
的作用。(如果不调用shutdown,则当每个引用它的fd都已关闭时,管道将自动关闭。)因此,由于复制的fd仍处于打开状态,因此进程可以写入管道(管道未关闭,因为对它的三个引用中只有两个已关闭)。
关于c - 有关使用dup()的困惑,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13800606/