代码之家  ›  专栏  ›  技术社区  ›  dgo.a

为什么在信号陷阱块中被杀死的进程会变成僵尸,而不是定期终止?

  •  1
  • dgo.a  · 技术社区  · 8 年前

    如果我用 Process.new ,他们可能会被杀死 .kill .然而,它们在信号陷阱中变成了僵尸:

    PROCESSES = {} of Int32 => Process
    
    spawn {
      loop { sleep 1 }
    }
    
    spawn {
      x = Process.new("sleep", "100".split)
      x.kill
      sleep 0.4
      puts x.terminated?
    
      x = Process.new("sleep", "100".split)
      PROCESSES[x.pid] = x
    }
    
    
    Signal::INT.trap {
      Signal::INT.reset
      PROCESSES.each { |pid, x|
        puts "killing: #{pid}"
        x.kill
        sleep 1
        puts "killed #{pid}? #{x.terminated?}"
      }
    }
    sleep
    

    使用 crystal run 并向进程发送一个SIGINT,将始终具有 .terminated? 为进程返回true,因为它位于僵尸中( <defunct> )州政府。

    1 回复  |  直到 8 年前
        1
  •  3
  •   Jonne Haß asterite    8 年前

    当父进程不收集它们的状态时,也就是当它不调用任何 wait 函数族。

    作为你的例子,你应该保持 Process 四处看看,然后打电话 Process#wait 在发出杀戮信号后。如果您想在多个进程中同时执行此操作,只需围绕每个调用 等待 用一个 spawn .