2016-09-30 47 views
0

我一直想创建一个子进程,两次分叉创建两个子进程。输出一个,发送给另一个。 我找到了这个示例代码。但我很困惑它是如何工作的。这个例子如何使用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

是的,它确实如此。 'close(1); dup(fd [1]);'序列等同于'dup2(fd [1],1):'。 –

回答

2

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

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

dup()函数将其参数文件描述符复制到编号最小的未打开文件描述符。 close()关闭描述符1,描述符0仍然打开,所以dup()使标准输出1指的是管道fd[1]的写入端。其他两个关闭呼叫正确关闭管道的两端。该过程不应该从管道的读取端读取fd[0],并且标准输出正在写入管道的写入端,因此其他描述符不再需要(如果未关闭,可能会导致问题)。

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

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

我注意到没有错误检查,尽管不太可能会出现任何问题 - 除非进程已经以标准输出或标准输入关闭,与所有合理的预期相反。