首页 > 解决方案 > 在调用 C 中的任何 exec 函数后,我可以使用子进程中的 paren 进程打开的文件描述符吗?

问题描述

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

假设p调用fork()创建一个子进程,该子进程cfork()调用其中一个exec家庭函数之后。

默认情况下,即使使用exec. 所以c应该能够与之通信p1,让它的父级p打开一个文件描述符到p1.

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

举个例子来说明我的意思,以下是和的p代码p1

//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"有了自己的源代码,我不能使用变量fd进行通信,p1因为它没有定义但文件描述符应该存在:那么如何引用它并使用它呢?

标签: cpipeforkposix

解决方案


默认情况下,即使使用exec. 所以c应该能够与之通信p1,让它的父级p打开一个文件描述符到p1.

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

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

  • 您可以dup2()将文件描述为众所周知的数字,例如标准输入 (0)、标准输出 (1) 或标准错误 (2),或父子代码同意的其他数字。

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

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

  • 作为前面的一个特例,您可以设置从父级到子级标准输入的管道,并通过管道将数字发送给子级。

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


推荐阅读