首先了解一下什么是僵尸进程、什么是孤儿进程。
(1)Z(zombie)僵尸进程
- 僵尸状态(zombie)是一个比较特殊的状态。当进程退出并且父进程(使用wait()系统调用)没有读取到子进程退出的返回代码时就会产生僵尸进程。
- 僵尸进程会以终止状态保持在进程表中,并且会一直等待父进程读取退出状态代码。
- 所以,只要子进程退出,父进程还在运行,但父进程没有读取子进程状态,子进程进入Z状态。
(2)孤儿进程
- 父进程如果提前退出,那么子进程后退出,进入Z之后,那该如何处理呢?
- 父进程先退出,子进程就称之为“孤儿进程”。
- 孤儿进程被1号init进程领养,当然要有init进程回收喽。
1 #include <stdio.h>
2 #include <stdlib.h>
3
4 int main( )
5 {
6 pid_t id = fork();
7 if(id < 0){
8 perror("fork");
9 return 1;
10 }
11 else if(id > 0){
12 printf("parent[%d] is sleeping...\n",getpid());
13 sleep(30);
14 }
15 else{
16 printf("child[%d] is begin z...\n" ,getpid());
17 sleep(5);
18 exit(EXIT_SUCCESS);
19 }
20 return 0;
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <unistd.h>
4
5 int main( )
6 {
7 pid_t id = fork();
8 if(id < 0){
9 perror("fork");
10 return 1;
11 }
12 else if(id == 0){
13 printf("I am child,pid : %d\n",getpid());
14 sleep(10);
15 }
16 else{
17 printf("I am parent, pid : %d\n" ,getpid());
18 sleep(3);
19 exit(0);
20 }
21 return 0;
22 }