僵死进程
原因: 子进程先结束,父进程未获取其退出码,导致子进程的 PCB(进程控制块)无法被系统回收,为僵死状态。
子进程先结束
当子进程结束后,并没有消失,仍然可以在系统中观测到,但此时子进程其实已经运行结束了,此时子进程的状态被称为僵死状态,系统把处于该类状态的进程称为僵死进程。
如图
父进程先结束
如果父进程先结束,子进程最后是不会变为僵死进程的。 系统会为子进程重新分配一个系统进程作为其父进程,获取其退出码。
如图:
僵死状态时PCB不回收有什么危害
①占用内核空闲②软件层面的资源也会占用
解决方法:
使用wait()接受子进程的退出码,使子进程的 PCB被系统回收,避免僵死进程产生。
缺点:wait会先阻塞父进程,直至子进程运行结束,父进程获取到子进程的退出码后,父进程才继续向下运行。
相关题目
1.
for(int i=0 ; i<2 ; ++i)
{
fork();
printf("A\n");
}
运行结果:
分析:
2.
for(int i=0 ; i<2 ; ++i)
{
fork();
printf("A");
}
分析: fork出的子进程会复制父进程的内存块(包含缓冲区)
相关知识:printf函数缓冲区刷新问题。
3.
fork() || fork() ;
printf("A\n");
分析: 和fork()的返回值 , || 逻辑表达式 相关。
左边fork()返回0 ,进而执行右边fork(),共fork出两个进程。一共2个A,加上父进程原来的一个A,共3个A.