僵死进程的产生:
1.当父进程未结束,子进程结束,并且父进程未获取子进程的退出状态。子进程被称为僵死进程。
2.进程执行结束,进程主体(执行代码、数据、资源)都释放,而其PCB 并未释放。
3.孤儿进程:父进程死后僵死进程成为“孤儿进程”,由init接管
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<assert.h>
#include<signal.h>
void fun(int sign)
{
wait(NULL);
}
int main()
{
pid_t n=fork();
assert(n!=NULL);
if(n==0)
{
printf("child start\n");
sleep(5);
printf("child end\n");
}
else()
{
printf("father start\n");
sleep(50);
printf("father end\n");
}
}
僵死进程的处理:
父进程直接进行wait(NULL),若进程为阻塞运行即进程状态变为阻塞,若非阻塞运行,即条件未完成,立即返回,就会出错。