首页 文章

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

提问于
浏览
0

我知道子进程与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 回答

  • 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
    

    这些管道的另一端分别在父管理中处理 .

相关问题