2016-01-24 105 views
0

我知道子进程与fork()调用之前的父进程具有完全相同的文件描述符表副本。假设我只是fork()调用之前打开一个管道,如果在fork()之后使用execv(),子进程是否可以访问pipe?

pipe(fd[2*i]); 
pipe(fd[2*i+1]); 
pid = fork(); 
if(pid) 
{ 
     strcpy(_args[0], "child"); 
     sprintf(_args[1], "%d", fd[2*i][0]); 
     sprintf(_args[2], "%d", fd[2*i+1][1]); 
     _args[4] = NULL; 
     if(execv(_args[0], _args) == -1) printf("execv error\n"); 
} 

假设孩子是我的孩子的过程,这是整个父和子进程使用管道的合法途径? (这是我的代码的实际部分)。

我的程序在执行时'冻结',当我使用SIGTSTP时,我得到/sysdeps/nptl/fork.c - 没有这样的文件或目录。父母和孩子都在同一个目录中。这里有什么问题?

+0

那是*伪代码*?因为如果你用'fd'调用['pipe'](http://man7.org/linux/man-pages/man2/pipe.2.html),然后使用'fd'作为数组的数组,工作得很好。 –

+0

您通常也会关闭每个进程中未使用的文件描述符。 –

+0

@JoachimPileborg编辑了代码区域。我盲目地复制了我的部分代码,没有意识到它会造成混淆。 – devonoober

回答

0

这只是代码的一部分,因此我可以猜测。如果你创建一个管道,你总是需要一个读者和一个作家。在你的例子中,我们只看到作者。

你通常在孩子身上做的是通过管道将其连接到父母,覆盖其标准输出/输出。关闭其标准输入/输出和DUP()管道FDS,像这样:

close(0); 
dup(in); // reading end of input pipe 
close(in); // close unused fd 
close(1); 
dup(out); // writing end of output pipe 
close(out);// close unused fd 

这些管的另一端在父分开处理。

+1

不要忘记在'dup'后关闭'in'和'out',特别是如果它们是管道描述符...... –

相关问题