在本节中,我们将看到如何在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\n", 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\n", getpid(), getppid()); while(1) sleep(1); printf("Inside Child---- PID of parent : %d\n", getppid()); }else if (x == 0) printf("Inside grandchild process---- PID of parent : %d\n", 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:~$