僵尸进程和孤儿进程

来源:互联网 发布:小企业的会计软件 编辑:程序博客网 时间:2024/06/04 19:43

Linux下进程的状态:
1.R ( running ) 可执行行态。
2.S ( sleeping ) 可中断睡眠态。
3.D (disk sleep)不可中断的睡眠,也叫硬盘睡眠。
4.T (Stop)暂停或跟踪状态。
5.X (Dead)即将被销毁。
6.Z (zombie)僵尸状态,等待回收资源。
僵尸状态:
当一个进程退出时,它并不是完全消失,而是等到它的父进程通过调用wait()系统调用来回收该子进程的退出状态和资源,在这个等待的过程中进程处于僵死状态。
以下代码来制造僵尸进程:

#include<unistd.h>  2 #include<stdio.h>  3 #include<error.h>  4 #include<stdlib.h>  5 int main()  6 {  7     pid_t pid=fork();  8     if(pid<0)  9     { 10         perror("fork"); 11     } 12     else if(pid==0) 13     { 14         //child 15         printf("child: pid=%d, ppid=%d \n ",getpid(),getppid()); 16         exit(0);//退出子进程 18     } 19     else{ 20         //father 21         printf("father: pid=%d ,ppid=%d \n ",getpid(),getppid()); 22     } 23     sleep(5);//睡眠五秒后退出 24     system("ps -l"); 25     return 0; 26 }

输出结果为:
这里写图片描述
子进程变成僵尸进程,等待父进程回收。
孤儿进程:
如果在这个期间,父进程退出了,并没有回收子进程的资源和状态,那么该子进程会变成孤儿进程,最终会被1号进程,也就是init进程收养。其次init会定期来调用wait()来完成僵尸进程的回收。
程序为以下:

 #include<unistd.h>  2 #include<stdio.h>  3 #include<error.h>  4 #include<stdlib.h>  5 int main()  6 {  7     pid_t pid=fork();  8     if(pid<0)  9     { 10         perror("fork"); 11     } 12     else if(pid>0) 13     { 14         //father 15         printf("father: pid=%d, ppid=%d \n ",getpid(),getppid()); 16     sleep(1);//睡眠一秒 打印pid 17     exit(1);//退出父进程,让子进程变为孤儿进程 18     } 19     else{ 20         //child 21         printf("child: pid=%d ,ppid=%d \n ",getpid(),getppid()); 22         sleep(5);//睡眠5s 后退出 23     } 24     system("ps -l"); 25     return 0; 26 }

父进程先退出,子进程变为孤儿进程被init领养(1号进程)。
这里写图片描述
注意:僵尸进程太多,无法回收会导致系统资源被占用太多,从而系统消耗太大而奔溃。