先决条件: C语言中的僵尸和孤立进程
僵尸进程:
僵尸进程是已完成执行但仍在进程表中具有条目的进程。仍需要此条目,以允许父进程读取其子进程的退出状态。
在父进程接受其返回码之前,终止的进程无法离开系统。如果其父进程已经失效,则“ init”进程已经采用了该进程,该进程始终接受其子级的返回码。但是,如果某个进程的父进程仍然存在,但从未执行过wait(),则该进程的返回代码将永远不会被接受,并且该进程将仍然是僵尸。
孤立流程:
孤立进程是仍在执行但父进程已死亡的进程。它们不会成为僵尸进程;它们不会成为僵尸进程。相反,它们由init(进程ID 1)采用,该init等待其子级。
当父项在其子项之前死亡时,该子项将自动被PID为1的原始“初始化”进程采用。
方法:
在下面的代码中,我们提出了一个场景,即有一个父母并且有一个孩子,那个孩子也有一个孩子,首先,如果我们的过程进入了子过程,我们将系统置于睡眠状态5秒钟,这样我们就可以完成父进程以使其孩子成为孤儿,然后我们将孩子的孩子作为僵尸进程,孩子的孩子完成其执行,而父母(即孩子)睡眠1秒钟,因此孩子的孩子不会叫终止,并且它的条目仍存在于进程表中。
下面是上述方法的实现:
// C program to execute zombie and
// orphan process in a single program
#include
int main()
{
int x;
x = fork();
if (x > 0)
printf("IN PARENT PROCESS\nMY PROCESS ID
: %d\n", getpid());
else if (x == 0) {
sleep(5);
x = fork();
if (x > 0) {
printf("IN CHILD PROCESS\nMY PROCESS ID :%d\n
PARENT PROCESS ID : %d\n", getpid(), getppid());
while(1)
sleep(1);
printf("IN CHILD PROCESS\nMY PARENT PROCESS ID
: %d\n", getppid());
}
else if (x == 0)
printf("IN CHILD'S CHILD PROCESS\n
MY PARENT ID : %d\n", getppid());
}
return 0;
}
输出:
注意:由于禁用fork(),以上代码可能无法与在线编译器一起使用。
想要从精选的最佳视频中学习和练习问题,请查看《基础知识到高级C的C基础课程》。