我看到了之前的问题「fork和exec的区别」,但是还有一些疑问。
当使用fork()
并在子进程上调用exec
时,由exec
创建的新进程仍然是子进程,对吗?
如果杀死父进程,孩子也会被杀死吗?
在顶部答案中显示的示例中,他调用wait
/waitpid
,因为如果父进程先终止,子进程就会死亡,然后你会得到ls
命令的部分或无输出,这正确吗?
exec
函数时,它仍然是一个子进程。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
.. 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。
exec
并不会创建一个新进程。它仍然是同一个子进程。exec
所做的是替换进程的代码和数据。我不知道你所说的“完成后放回”是什么意思,我想不出任何符合这个描述的东西。 - Gilles 'SO- stop being evil'