我知道子进程与fork()调用之前的父进程具有完全相同的文件描述符表副本。假设我在fork()调用之前打开一个管道,
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 :(得分:0)
这只是代码的一部分,因此我可以猜测。如果您创建管道,则始终需要读取器和写入器。在你的样本中,我们只看到作者。
您通常在孩子身上做的是通过管道将其连接到父母,覆盖其stdin / out。关闭它的stdin / out和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
这些管道的另一端分别在父母处理。