孤儿进程:
//orphan.c 孤儿进程演示
#include <stdio.h>
#include <unistd.h>
#include <sys/wait.h>
int main(void)
{
pid_t pid;
pid = fork();
if (pid == 0) {
while (1) {
printf("I am child, my parent pid = %d\n", getppid());
sleep(1);
}
} else if (pid > 0) {
printf("I am parent, my pid is = %d\n", getpid());
sleep(9);
printf("------------parent going to die------------\n");
} else {
perror("fork");
return 1;
}
return 0;
}
- 僵尸进程
僵尸进程: 进程终止,父进程尚未回收,子进程残留资源(PCB)存放于内核中,变成僵尸(Zombie)进程。
【zoom .c】
特别注意,僵尸进程是不能使用kill命令清除掉的。因为kill命令只是用来终止进程的,而僵尸进程已经终止。为什么会导致僵尸进程呢?
僵尸进程导致原因:
子进程先于父进程退出,退出原因保存在PCB中,操作系统检测到进程退出后,通过父进程进行回收,但是此时父进程可能没有关注到我们子进程已经退出了,这时候操作系统不会随意的去释放我们的子进程资源,此时我们的子进程已经退出,但是我们的资源却没有被回收。此时我们的子进程就是一个Z(将死态)也就是我们称为 的僵尸进程
一下代码就是产生了僵尸进程
#include <stdio.h>
#include <unistd.h>
int main(){
pid_t pid = fork();
if(pid == 0){
printf("i am child\n");
sleep(3);
printf("i die\n");
}else{
while(1){
printf("i am father\n");
sleep(5);
}
}
}
产生的结果就是导致了僵尸进程。
所以在进程中我们应该去避免产生僵尸进程,如果过多的产生了僵尸进程,我们的资源泄漏严重,达到了进程数量的上限之后我们就不能再创建新的进程。
解决方案:
- 使用wait相关函数去回收子进程
- 杀死父进程
- 使用信号SIGCHLD来释放我们的子进程资源
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)