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

最佳答案

这只是代码的一部分,因此我可以猜测。如果创建管道,则始终需要读者和作家。在您的样本中,我们仅看到作者。

您通常在子级中执行的操作是通过管道将其连接到父级,从而覆盖其标准输入/输出。关闭其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


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

关于c - 如果在fork()之后使用execv(),子进程是否可以访问管道?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34976367/

10-11 23:08
查看更多