📜  如何在单个程序中执行僵尸和孤立进程?

📅  最后修改于: 2021-05-30 11:58:26             🧑  作者: Mango

先决条件: 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基础课程》。