只有一个问题,当我 fork() 时,我创建了父进程和子进程。当我的 child 仍在运行时可以终止我的 parent 吗?
基本就这个图? Differences between fork and exec
if(!fork())
{
//child
while(1);
}
else
{
//parent
exit();
}
另一种情况是我的 child 终止妊娠。我的 parent 能够收到来自 main 的返回值吗?如果是,我如何检索该值?
exec 和 execlp 有什么区别?
最后,我知道当你执行时,你会覆盖内存(堆、堆栈、文本、数据)。基本上,调用 new .exe 。但在PCB下面呢?只有PID、PPID 保留,而state 和sp 全部覆盖?
最佳答案
当您fork
时,您创建了一个全新且独立的进程。 child 继承了某些方面,比如打开的文件描述符和其他东西。
因此您可以退出父进程,子进程将继续运行。
为了检索子进程的退出代码和状态,您可以使用 pid_t waitpid(pid_t pid, int *status, int options); 并相应地解释状态。事实上,为了避免僵尸进程,无论如何你都应该等待子进程。
exec
系列在当前运行的进程内创建一个新的可执行文件,因此 PID 保留,但执行状态已初始化。
关于c - 需要深入解释fork和exec,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17260135/