fork(), exec and waitpid()

5

我看到了之前的问题「fork和exec的区别」,但是还有一些疑问。

当使用fork()并在子进程上调用exec时,由exec创建的新进程仍然是子进程,对吗?

如果杀死父进程,孩子也会被杀死吗?

顶部答案中显示的示例中,他调用wait/waitpid,因为如果父进程先终止,子进程就会死亡,然后你会得到ls命令的部分或无输出,这正确吗?

4个回答

3
exec 命令用一个新程序替换当前的程序,因此子进程仍然是一个子进程 (实际上是同一进程)。
不,杀死父进程并不会杀死子进程 (子进程被变成了 孤儿进程)。

2
杀死父进程并不会杀死子进程。当子进程调用exec函数时,它仍然是一个子进程。
在链接问题的示例中,流程图大致描述了shell用于调用命令的过程。除非命令被后台执行,否则shell - 父进程 - 将等待子进程终止才继续读取命令。否则等待子进程是不必要的。
另请参见此问题

2
当使用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");
}

在这里,您需要让父进程打印消息"parent print",然后打印"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 循环中永远停留,而父进程已经终止。

1
当在子进程上调用exec时,新进程由子进程处理。子进程的进程被exec调用替换,然后在完成后放回。不,调用exec并不会创建一个新进程。它仍然是同一个子进程。exec所做的是替换进程的代码和数据。我不知道你所说的“完成后放回”是什么意思,我想不出任何符合这个描述的东西。 - Gilles 'SO- stop being evil'
你指的“原始执行路径”是什么?在什么时候完成了什么? - Gilles 'SO- stop being evil'
打开文件句柄的示例是一个很好的案例,可以展示当子进程使用已打开的文件时,父进程应该等待子进程。 - user1644340

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

是的,它仍然是子元素。
Does killing the parent process kills the child too?

不会。如果父进程因为任何原因死亡,而子进程仍在执行,则该子进程将被init进程(进程ID=1)接管,成为这个孤儿进程的新父进程。

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

waitpid/wait用于将子进程的状态通知给父进程。需要注意的是,如果父进程有多个子进程,则通常会等待任何一个子进程,除非您指定了特定子进程的进程ID。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接