您的位置:首页 > 其它

孤儿进程和僵尸进程详解

2017-12-26 23:31 281 查看
之前没有特别区分这两种概念,以为孤儿进程就是僵尸进程,但是其实是有差别的,下面我们从概念上来看

孤儿进程:

父进程先死了,子进程还在继续运行,这样的进程会里面被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杀死它
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息