我阅读了较早的问题“fork 和 exec 之间的差异”,但它让我有些疑问。
当使用fork()
并且你在一个孩子上调用 exec 时,创建的新进程exec
仍然是一个孩子,对吗?
杀死父进程是否也会杀死孩子?
在顶部答案中显示的绘图/示例中,他调用wait
/waitpid
因为如果父进程首先终止,则子进程死亡,然后您得到ls
命令的部分输出或没有输出,对吗?
exec
用一个新的替换当前正在执行的进程映像。所以是的,孩子是一个孩子进程(它实际上是同一个进程。)
不,杀死父母不会杀死孩子(孩子是孤儿)。
杀死父进程不会杀死子进程。当子进程调用一个exec
函数时,它仍然是一个子进程。
在链接问题的示例中,流程图粗略地描述了 shell 用来调用命令的过程。除非命令是后台的,否则 shell - 父进程 - 将等到子进程终止,然后再继续读取命令。否则就没有必要等孩子了。
另请参阅此问题。
当使用 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 循环中。
.. 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。