【问题标题】:fork(), exec and waitpid()fork()、exec 和 waitpid()
【发布时间】:2012-08-29 10:43:11
【问题描述】:

我阅读了之前的问题Differences between fork and exec,但它让我产生了一些疑问。

当使用fork() 并且你对一个子进程调用exec 时,exec 创建的新进程仍然是一个子进程,对吧?

杀死父进程是否也会杀死子进程?

the top answer 中显示的绘图/示例中,他调用wait/waitpid,因为如果父进程首先终止,子进程就会死掉,然后您会得到ls 命令的部分输出或没有输出,对吗?

【问题讨论】:

    标签: c unix process fork wait


    【解决方案1】:

    exec 用一个新的替换当前正在执行的进程映像。所以是的,child 是一个子进程(实际上是同一个进程。)

    不,杀父不杀子(子是orphaned)。

    【讨论】:

      【解决方案2】:

      杀死父进程不会杀死子进程。当子进程调用exec函数时,它仍然是子进程。

      在链接问题的示例中,流程图粗略地描述了 shell 用来调用命令的过程。除非命令是后台的,否则 shell(父进程)将等到子进程终止,然后再继续读取命令。否则就没有必要等待孩子了。

      另见this question

      【讨论】:

        【解决方案3】:
        .. the new process created by exec is still a child right?
        

        是的,还是那个孩子。

        Does killing the parent process kills the child too?
        

        没有。如果父进程因任何原因而死,而子进程仍在执行,则子进程将收养init process(进程 ID=1)进程,该进程将成为此 orphan process 的新父进程。

        calls wait/waitpid because if the parent process terminates first, the child...
        

        waitpid/wait 用于将孩子的状态通知给父母。请注意,如果父进程有很多子进程,则它通常会等待 any 子进程,除非您指定特定子进程的进程 ID。

        【讨论】:

          【解决方案4】:

          当使用 fork() 并在子进程上调用 exec 时,新进程 exec 创建的还是个孩子吧?

          当对子进程调用 exec 时,新进程由子进程处理。子进程被 exec 调用替换。

          杀死父进程是否也会杀死子进程?

          当父进程死亡时(至少在 Linux 中),通过让操作系统发送信号,子进程可能会死亡,否则它会继续存在。

          他调用 wait/waitpid 是因为如果父进程先终止, 子进程死亡,然后你得到部分或没有输出 ls 命令,对吗?

          您希望等待子进程(如您所指的示例中所示),以便: a)您可以在完成后正确终止您的子进程 b)子进程可以访问父进程的所有资源......这意味着如果您的子进程有一个父进程打开的文件句柄并且父进程退出,但子进程假设文件只要它正在运行就会打开,坏事会发生。

          看看这个简单的例子: 首先,看一个进程列表的输出:

          mike@linux-4puc:~> ps
          PID TTY          TIME CMD
          18577 pts/2    00:00:00 bash
          18643 pts/2    00:00:00 ps
          

          然后运行这个小程序:

          void main() 
          { 
              if(fork()){
                printf("parent print");
              }
              else
                while(1);
              printf("done");
          }
          

          在这里,您将让父打印消息“父打印”,然后“完成”。完成后检查“ps”列表,您会在树中看到一个新进程:

          mike@linux-4puc:~> ps
          PID TTY          TIME CMD
          18577 pts/2    00:00:00 bash
          18673 pts/2    00:00:02 a.out
          18678 pts/2    00:00:00 ps
          

          a.out 是孩子,当父母终止时,它永远坐在 while 循环中。

          【讨论】:

          • “在子进程上调用 exec 时,新进程由子进程处理。子进程被 exec 调用替换,然后在完成后放回。”否:调用exec 不会创建新进程。它仍然是同一个子进程。 exec 所做的就是替换进程的代码和数据。我不知道你所说的“完成后放回去”是什么意思,我想不出任何符合这种描述的东西。
          • 否:您指的是什么“原始执行路径”?什么时候完成?
          • 打开文件句柄示例很好地说明了如果孩子使用打开的文件,父母应该何时等待孩子。
          猜你喜欢
          • 2012-11-24
          • 1970-01-01
          • 2012-11-09
          • 2015-12-01
          • 2016-03-19
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多