关于dup()使用的困惑

时间:2012-12-10 12:05:36

标签: c pipe dup

当我们使用dup将STDOUT重定向到管道时,我们会这样做:

close(1); dup(fd[1]);
close(fd[0]);
close(fd[1]);
execlp("ls","-al",(char *) NULL);

但我们正在关闭管道的两端。那么如何将STDOUT写入管道?

2 个答案:

答案 0 :(得分:1)

因为一旦文件描述符编号1(例如标准输出)关闭,该编号可用于进一步dupopen次调用。

您应该检查closedup系统调用的结果。

当然,关闭管道的两端是没有意义的,除非你之前做了一些有用的事情(即在适当的目的上阅读或写作)。

请参阅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仍处于打开状态,进程可以写入管道(未关闭,因为三个参考文献中只有两个被关闭了。