当我们使用dup将STDOUT重定向到管道时,我们会这样做:
close(1); dup(fd[1]);
close(fd[0]);
close(fd[1]);
execlp("ls","-al",(char *) NULL);
但我们正在关闭管道的两端。那么如何将STDOUT写入管道?
答案 0 :(得分:1)
因为一旦文件描述符编号1(例如标准输出)关闭,该编号可用于进一步dup
或open
次调用。
您应该检查close
和dup
系统调用的结果。
当然,关闭管道的两端是没有意义的,除非你之前做了一些有用的事情(即在适当的目的上阅读或写作)。
请参阅open(2),dup(2),pipe(2),close(2)手册页。阅读Advanced Linux Programming书。
答案 1 :(得分:1)
在示例代码中,您没有关闭管道的两端。您正在关闭fd[0]
和fd[1]
。最初,关闭那些就足以关闭管道的两端,但不是在你复制fd[0]
之后。您还必须关闭重复的fd以关闭对管道的所有引用。那将是愚蠢的:你保持一个精确的结束,以便ls可以写入。
也许你的混淆是close()
正在关闭?它关闭fd,即对管道末端之一的引用。它不会关闭管道本身:这就是shutdown()
会做的事情。 (如果你没有调用shutdown,那么当引用它的每个fd都被关闭时,管道会自动关闭。)因此,由于复制的fd仍处于打开状态,进程可以写入管道(未关闭,因为三个参考文献中只有两个被关闭了。