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


在本节中,我们将了解如何在C/C++中的单个程序中执行僵尸进程和孤儿进程。在进入主要讨论之前,让我们先了解什么是僵尸进程和孤儿进程。

僵尸进程

僵尸进程是指其执行已完成但仍在进程表中具有条目的进程。僵尸进程通常发生在子进程中,因为父进程仍然需要读取其子进程的退出状态。一旦使用wait系统调用完成此操作,僵尸进程就会从进程表中删除。这称为收割僵尸进程。

孤儿进程

孤儿进程是指即使其父进程已终止或完成仍在运行的进程。孤儿进程可以有意或无意地创建。

有意创建的孤儿进程在没有任何手动支持的情况下在后台运行。这通常用于启动无限运行的服务或在无需用户干预的情况下完成长时间运行的任务。

无意创建的孤儿进程是在其父进程崩溃或终止时创建的。可以使用进程组机制避免无意创建的孤儿进程。

现在,在以下代码中,我们将同时执行僵尸进程和孤儿进程。这里我们有一个父进程,它有一个子进程,而这个子进程又有另一个子进程。如果我们的控制插入到子进程中,那么我们将停止执行5秒钟,以便它可以完成父进程。因此,子进程成为孤儿进程。之后,孙子进程将转换为僵尸进程。当其父进程(主进程的子进程)休眠1秒时,孙子进程完成执行。因此,孙子进程不会调用终止,并且其条目将保留在进程表中。

示例代码

#include <stdio.h>
#include <unistd.h>
int main() {
   int x = fork(); //create child process
   if (x > 0) //if x is non zero, then it is parent process
      printf("Inside Parent---- PID is : %d
", getpid());    else if (x == 0) { //for chile process x will be 0       sleep(5); //wait for some times       x = fork();       if (x > 0) {          printf("Inside Child---- PID :%d and PID of parent : %d
", getpid(), getppid());          while(1)             sleep(1);          printf("Inside Child---- PID of parent : %d
", getppid());       }else if (x == 0)       printf("Inside grandchild process---- PID of parent : %d
", getppid());    }    return 0; }

输出

soumyadeep@soumyadeep-VirtualBox:~$ ./a.out
Inside Parent---- PID is : 3821
soumyadeep@soumyadeep-VirtualBox:~$ Inside Child---- PID :3822 and PID of parent : 686
Inside grandchild process---- PID of parent : 3822
soumyadeep@soumyadeep-VirtualBox:~$

更新于: 2019年7月30日

2K+ 次浏览

开启你的 职业生涯

通过完成课程获得认证

开始学习
广告