在C中调用任何exec函数后,能否在子进程中使用paren进程打开的文件描述符?

时间:2019-02-02 13:31:41

标签: c pipe fork posix

假设我有一个进程p,该进程使用文件描述符(例如,未命名的管道)与父进程p1进行通信。

假设p调用fork()创建一个子进程c,该子进程在fork()之后立即调用exec族函数之一。

即使使用exec,默认情况下父对象的文件描述符也会复制到孩子。因此,c应该能够与p1进行通信,让其父p打开到p1的文件描述符。

如果仅在c(和p)中定义了与该文件描述符相对应的变量,如何在p1子进程的C源代码中获取该文件描述符?< / p>

仅举一个例子,下面是pp1的代码

//p1 process
int fd[2];
pipe(fd);
pid_t p_pid, c_pid;

p_pid = fork();
if(p_pid == 0) // p process
{
/* p_pid closes up input side of pipe */
    close(fd[0]);
    c_pid = fork();
    if (c_pid)==0 //c child process
    {
        exec("execution/child/process"...); 
    }
    else
    {
        ...// do p process parenting stuff      
    }

 }
 else
 {
     /* Parent p1 process closes up output side of pipe */
     close(fd[1]);
 }

现在"execution/child/process"拥有自己的源代码,由于无法定义变量,但文件描述符应该存在,因此我无法使用变量fdp1进行通信:因此如何引用并使用它?

1 个答案:

答案 0 :(得分:1)

  

默认情况下,甚至父级的文件描述符也会复制到子级   使用exec时。因此,c应该能够与p1通信,   其父项pp1打开了文件描述符。

是的。主要条件是未将文件描述符设置为close-on-exec。

  

如何在c子代的C源代码中获取该文件描述符   如果对应于该文件描述符的变量是   仅在p(和p1)中定义?

  • 您可以dup2()将文件描述到一个众所周知的数字上,例如stdin(0),stdout(1)或stderr(2)或其他一些带有父代代码的数字同意。

  • 您可以将文件描述符号作为参数传递给孩子。

  • 您可以将数字写入孩子随后从中读取的文件中。

  • 作为上一个特殊情况,您可以设置从父级到子级stdin的管道,然后通过该管道将编号发送给子级。

这些不是唯一的可能性,但我认为它们涵盖了所有最简单和最好的可能性。请注意,第一个是唯一一个不依赖孩子合作的人。