之前没有特别区分这两种概念,以为孤儿进程就是僵尸进程,但是其实是有差别的,下面我们从概念上来看
孤儿进程:
父进程先死了,子进程还在继续运行,这样的进程会里面被init(ppid=1)进程回收
僵尸进程:
子进程自己退出了,父进程没有调用wait或者waidpid函数清理子进程的状态,所以这个状态一直会在进程列表存在
下面是我做的实验:
1.孤儿进程代码实例:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/stat.h>
#include <sys/stat.h>
#include <sys/types.h>
int main(int argc, char *argv[]) {
pid_t pid;
pid = fork();
if (pid < 0) {
printf("fork fail");
exit(1);
} else if (pid > 0) {
printf("parent process\n");
exit(1);
}
setsid();
pid = fork();
if (pid < 0) {
printf("second fork fail");
exit(1);
} else if (pid > 0) {
printf("second parent process");
exit(1);
}
//这里再开10个子进程
int i;
for (i = 0; i< 10; i++) {
pid_t sonpid;
sonpid = fork();
if (sonpid < 0) {
printf("fork fail");
exit(1);
} else if (pid > 0) {
exit(1);
} else {
while(1) {
printf("sonpid=%d\n", sonpid);
}
}
}
return 0;
}
- -9杀死父进程
1.僵尸进程代码实例:
1 #include <stdio.h>
2 #include <unistd.h>
3 #include <stdlib.h>
4
5 int main(int argc, char *argv[]) {
6
7 pid_t pid;
8 pid = fork();
9 if (pid <0) {
10 printf("fork fail\n");
11 exit(1);
12 } else if (pid == 0) {
13 printf("son process fail\n");
14 exit(1);
15 }
16 while(1) {
17 printf("parent process");
18 }
19 return 0;
20 }
总结:
孤儿进程会被init进程回收
僵尸进程可以通过top命令查看,然后通过关键字defunct杀死它