代码之家  ›  专栏  ›  技术社区  ›  roschach

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

  •  0
  • roschach  · 技术社区  · 6 年前

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

    假设 电话 fork() 创建子进程 c 就在那之后 Frk() 调用其中一个 exec 家庭功能。

    默认情况下,即使使用 执行程序 . 所以 C 应该能够与 P1 ,有其父 打开文件描述符到 P1 .

    我怎样才能在C源代码中得到这个文件描述符 C 如果只在 (和) P1 )?

    为了举例说明我的意思,下面是 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 因为它没有定义,但是文件描述符应该存在:那么如何引用它并使用它呢?

    1 回复  |  直到 6 年前
        1
  •  1
  •   John Bollinger    6 年前

    默认情况下,父级的文件描述符甚至复制到子级 使用时 exec . 所以 c 应该能够与 p1 ,拥有 其亲本 p 打开文件描述符到 P1 .

    对。主要的限制是文件描述符没有在exec上设置close。

    我怎样才能在C源代码中得到这个文件描述符 C 小孩 如果与该文件描述符对应的变量是 仅定义在 (和) P1 )?

    • 你可以 dup2() 一个众所周知的数字上的文件说明,如stdin(0)、stdout(1)或stderr(2),或父代码和子代码同意的其他数字。

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

    • 您可以将号码写入一个文件,孩子随后从中读取该号码。

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

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