当我们使用 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 仍然打开,进程可以写入管道(它没有关闭,因为对它的三个引用中只有两个被关闭)。
关于关于 dup() 用法的困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13800606/