fork(),exec和waitpid()

时间:2012-09-04 18:12:57

标签: c unix process fork wait

我读了之前的问题Differences between fork and exec,但这让我有些疑惑。

使用fork()并且对孩子调用exec时,由exec创建的新流程仍然是孩子吗?

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

the top answer中显示的图/​​示例中,他调用wait / waitpid,因为如果父进程首先终止,则子进程会终止,然后您将获得部分输出或不输出ls命令是正确的吗?

4 个答案:

答案 0 :(得分:3)

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

不,杀死父母不会杀死孩子(孩子是orphaned)。

答案 1 :(得分:2)

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

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

另见this question

答案 2 :(得分:2)

  

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

当给孩子调用exec时,孩子会处理新的过程。子进程被exec调用替换。

  

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

当父进程死亡(至少在Linux中)时,通过让OS发送信号,子进程可能会死掉,但除此之外它就会继续存在。

  

他调用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循环中。

答案 3 :(得分:2)

.. the new process created by exec is still a child right?

是的,它仍然是孩子。

Does killing the parent process kills the child too?

没有。如果父母因任何原因而死亡且孩子仍在执行,那么孩子将被init process(进程ID = 1)进程采用,这将成为此{{3}的新父进程}}

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

orphan process用于将孩子的状态通知父母。请注意,如果父进程有许多子进程,那么除非您指定特定子进程的进程ID,否则它通常会等待任何子进程。