如果在fork()之后使用execv(),子进程是否可以访问pipe?
问题描述:
我知道子进程与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 - 没有这样的文件或目录。父母和孩子都在同一个目录中。这里有什么问题?
答
这只是代码的一部分,因此我可以猜测。如果你创建一个管道,你总是需要一个读者和一个作家。在你的例子中,我们只看到作者。
你通常在孩子身上做的是通过管道将其连接到父母,覆盖其标准输出/输出。关闭其标准输入/输出和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',特别是如果它们是管道描述符...... –
那是*伪代码*?因为如果你用'fd'调用['pipe'](http://man7.org/linux/man-pages/man2/pipe.2.html),然后使用'fd'作为数组的数组,工作得很好。 –
您通常也会关闭每个进程中未使用的文件描述符。 –
@JoachimPileborg编辑了代码区域。我盲目地复制了我的部分代码,没有意识到它会造成混淆。 – devonoober