为什么很多服务一定要fork两次进程呢?
我们看到很多网络服务器在实现守护进程的时候 都要fork两次
孤儿进程 和僵尸进程
-
孤儿进程
- 无父无母 ,无依无靠,形单影只 如果放任不管就会很惨 要不饿死 要不抢东西吃被打
- 因此需要社会负责 福利院收养 同样操作系统也会 init 进程收养
-
僵尸进程
-
有父母但是父母不管死活 让进程自生自灭 死了之后暴尸荒野 成了孤魂野鬼 阴魂不散的僵尸 不生不灭 至死不休
-
简直可怕 谁也没法办法 解铃还须系铃人呀 只要父母才能消散孩子的怨念 才能超度
-
在系统中僵尸进程是杀不死的 即使 kill -9 也不行
-
三种处理方式:
-
预防措施:
- 在孩子出生时候教育好 告诉他如果发生意外父母保护你的
- 父进程开始的安装 sigchild 信号处理
- 父母一直啥也不干就跟着 一旦发生意外 就埋了
- 父进程 使用wait/waitpid 阻塞自己等待子进程退出
- 孩子管不了 教育失败了 只能把父母和孩子一起监狱改造
- 将父进程变成孤儿进程 然后init收养 把自己的孩子过继给 init代管
原理就是 fork两次 原理
- fork 第一次 儿子进程 让其成为孤儿 init接管
- fork第二次 孙子进程 儿子成孤儿没能力抚养 就是孙子也过继给init
- 就保证不会产生僵尸进程
日常处理
- 直接杀死僵尸进程的父进程
- 僵尸进程被init托管可以正确终止
本文来自博客园,作者:vx_guanchaoguo0,转载请注明原文链接:https://www.cnblogs.com/guanchaoguo/p/16831754.html