这块重点讲以下两个状态的进程:
Z (zombie)僵尸进程
僵尸状态:当进程退出并且父进程没有读取到子进程退出的返回代码时产生僵尸进程。
例如:
1 #include<stdio.h>
2 #include<stdlib.h>
3 #include<unistd.h>
4
5 int main()
6 {
7 pid_t pid=fork();
8 if(pid<0)
9 perror("fork"),exit(1);
10 else if(pid>0)//parent
11 {
12 printf("parent [%d] is sleeping \n",getpid());
13 sleep(30);
14 }
15 else
16 {
17 printf("child[%d] is begining z \n",getpid());
18 sleep(5);
19 exit(EXIT_SUCCESS);
20 }
21 return 0;
22 }
可以看出僵尸状态会以终止状态保持,并且会一直等待父进程读取退出码。如果子进程退出,父进程还在运行,但父进程没有读取子进程状态,子进程进入Z状态。
当父进程退出时,回收子进程。
孤儿进程
父进程如果提前退出,子进程后退出,该子进程就为孤儿进程。
1 //孤儿进程
2
3 #include<stdio.h>
4 #include<stdlib.h>
5 #include<unistd.h>
6
7 int main()
8 {
9 pid_t pid=fork();
10 if(pid<0)
11 perror("fork"),exit(1);
12 else if(pid==0)//child
13 {
14 printf("i am child ,pid [%d] \n",getpid());
15 sleep(30);
16 }
17 else//parent
18 {
19 printf(" i am father,pid :%d \n",getpid());
20 sleep(10);
21 exit(0);
22 }
23 return 0;
24 }
可以看到父进程退出后,子进程成了孤儿进程,孤儿进程被1号init进程领养,也要init进程回收。