这个例子如何使用dup工作?

时间:2016-09-30 02:53:58

标签: c linux pipe dup2 dup

我一直想创建一个子进程,它会分两次创建两个子进程。用一个输出,发送到另一个。 我找到了这个示例代码。但我对它是如何工作感到困惑。

我找到了example here。但我对使用dup的方式以及它是如何工作的方式感到困惑。

close(1);
dup(fd[1]);
close(fd[0]);
close(fd[1]);

然后将输出传送到第二个分叉进程,它的管道连接如下:

close(0);
dup(fd[0]);
close(fd[0]);
close(fd[1]);

1 个答案:

答案 0 :(得分:2)

主要的相关行是这些 - 它们形成一个标准的习语(但用dup2(fd[1], 1)替换前两行更容易):

close(1);
dup(fd[1]);
close(fd[0]);
close(fd[1]);

dup()函数将其参数文件描述符复制到编号最小的unopen文件描述符。 close()关闭描述符1,描述符0仍处于打开状态,因此dup()使标准输出1引用管道的写入端{{ 1}}。另外两个关闭调用正确地关闭管道的两端。该进程不应该从管道fd[1]的读取端读取,并且标准输出正在写入管道的写入端,因此不再需要其他描述符(并且如果它是,则可能导致问题没有关闭)。

因此,这是将管道的写入端连接到进程的标准输出的标准序列。第二个序列类似,但将管道的读取端连接到标准输入(而不是写入标准输出端)。

通常,当您将管道的一端连接到标准输入或标准输出时,该过程应关闭原始管道的两个端。

我注意到没有错误检查,但是不可能出现任何问题 - 除非该过程是以标准输出或标准输入关闭启动的,这与所有合理预期相反。