为什么很多服务一定要fork两次进程呢?

我们看到很多网络服务器在实现守护进程的时候 都要fork两次

孤儿进程 和僵尸进程

  • 孤儿进程

    • 无父无母 ,无依无靠,形单影只 如果放任不管就会很惨 要不饿死 要不抢东西吃被打
    • 因此需要社会负责 福利院收养 同样操作系统也会 init 进程收养
  • 僵尸进程

  • 有父母但是父母不管死活 让进程自生自灭 死了之后暴尸荒野 成了孤魂野鬼 阴魂不散的僵尸 不生不灭 至死不休

  • 简直可怕 谁也没法办法 解铃还须系铃人呀 只要父母才能消散孩子的怨念 才能超度

  • 在系统中僵尸进程是杀不死的 即使 kill -9 也不行

  • 三种处理方式:

  • 预防措施:

    • 在孩子出生时候教育好 告诉他如果发生意外父母保护你的
    • 父进程开始的安装 sigchild 信号处理
    • 父母一直啥也不干就跟着 一旦发生意外 就埋了
      • 父进程 使用wait/waitpid 阻塞自己等待子进程退出
    • 孩子管不了 教育失败了 只能把父母和孩子一起监狱改造
      • 将父进程变成孤儿进程 然后init收养 把自己的孩子过继给 init代管
原理就是 fork两次 原理
  • fork 第一次 儿子进程 让其成为孤儿 init接管
  • fork第二次 孙子进程 儿子成孤儿没能力抚养 就是孙子也过继给init
  • 就保证不会产生僵尸进程

日常处理

  • 直接杀死僵尸进程的父进程
  • 僵尸进程被init托管可以正确终止
posted @ 2022-10-27 11:55  vx_guanchaoguo0  阅读(57)  评论(0编辑  收藏  举报