我知道子进程与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");
}
假设child是我的子进程,这是在父进程和子进程中使用管道的合法方式吗? (这是我的代码的实际部分) .
我的程序在执行时'冻结',当我使用SIGTSTP时,我得到/sysdeps/nptl/fork.c - 没有这样的文件或目录 . 父项和子项都在同一目录中 . 这里有什么问题?
1 回答
这只是代码的一部分,因此我可以猜测 . 如果您创建管道,则始终需要读取器和写入器 . 在您的示例中,我们只看到作者 .
你通常在孩子身上做的是通过管道将它连接到父母,覆盖它的stdin / out . 关闭它的stdin / out和dup()管道的fds,如下所示:
这些管道的另一端分别在父管理中处理 .