只有1个问题,当我fork()时,我创建了父进程和子进程。我的孩子还在跑步时可以终止我的父母吗?
这张图基本上是什么? Differences between fork and exec
if(!fork())
{
//child
while(1);
}
else
{
//parent
exit();
}
另一种情况是如果我的孩子被终止了。我的父母能否收到来自main的返回值?如果是,我该如何检索该值?
exec和execlp有什么不同?
最后,据我所知,当你执行时,你会覆盖内存(堆,堆栈,文本,数据)。基本上,调用新的.exe。但在PCB下呢?只有PID,PPID保持状态和sp全部覆盖?
答案 0 :(得分:1)
当你fork
时,你创建一个完全新的独立过程。孩子继承了某些方面,比如打开文件描述符和其他东西。
因此,您可以退出父级,孩子将继续运行。
为了检索孩子的退出代码和状态,您可以使用pid_t waitpid(pid_t pid, int *status, int options);
并相应地解释状态。事实上,为了避免Zombiprocesses,你应该等待孩子。
exec
系列在当前正在运行的进程中创建一个新的可执行文件,因此PID保持不变,但执行状态已初始化。