如果在fork()之后使用execv(),子进程是否可以访问管道?

时间:2016-01-24 13:28:41

标签: c operating-system pipe exec fork

我知道子进程与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 - 没有这样的文件或目录。父项和子项都在同一目录中。这有什么问题?

1 个答案:

答案 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

这些管道的另一端分别在父母处理。