先决条件: C语言中的僵尸进程和孤儿进程
null
僵尸程序: 僵尸进程是一个已完成执行但仍在进程表中有一个条目的进程。仍然需要此条目,以允许父进程读取其子进程的退出状态。 在父进程接受其返回代码之前,终止的进程不能离开系统。如果它的父进程已经死了,那么它已经被“init”进程采用,该进程总是接受其子进程的返回码。但是,如果进程的父进程处于活动状态,但从未执行wait(),则该进程的返回代码将永远不会被接受,并且该进程仍将是一个僵尸。
孤立进程: 孤立进程是仍在执行但其父进程已死亡的进程。它们不会变成僵尸进程;相反,它们被init(进程ID 1)采用,后者等待其子进程。 当父进程先于子进程死亡时,子进程将自动被PID为1的原始“init”进程采用。
方法: 在下面的代码中,我们做了一个场景,有一个父进程,它有一个子进程,该子进程也有一个子进程,首先,如果我们的进程进入子进程,我们将系统置于睡眠状态5秒,这样我们就可以完成父进程,使其子进程成为孤儿,然后我们将子进程作为僵尸进程,当父对象(即子对象)睡眠1秒时,子对象的子对象完成其执行,因此子对象的子对象不调用terminate,并且其条目仍存在于进程表中。
以下是上述方法的实施情况:
// C program to execute zombie and // orphan process in a single program #include <stdio.h> int main() { int x; x = fork(); if (x > 0) printf ("IN PARENT PROCESSMY PROCESS ID : %d", getpid()); else if (x == 0) { sleep(5); x = fork(); if (x > 0) { printf ("IN CHILD PROCESSMY PROCESS ID :%d PARENT PROCESS ID : %d", getpid(), getppid()); while (1) sleep(1); printf ("IN CHILD PROCESSMY PARENT PROCESS ID : %d", getppid()); } else if (x == 0) printf ("IN CHILD'S CHILD PROCESS MY PARENT ID : %d", getppid()); } return 0; } |
输出: 注: 由于禁用了fork(),上述代码可能无法与联机编译器一起使用。
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END