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号进程)。
注意:僵尸进程太多,无法回收会导致系统资源被占用太多,从而系统消耗太大而奔溃。