Ruby 忽略发送到我自己的进程组的信号

Ruby 忽略发送到我自己的进程组的信号,ruby,unix,signals,Ruby,Unix,Signals,我正在为一组子进程编写一个包装器,我想响应一些信号并将它们传播给子进程。因此,例如,如果包装器接收到QUIT,它应该将QUIT发送给所有子进程(不仅是直接子进程,而且是生成的所有进程) 因此,我使用setsid,然后用一个只发出kill(sig,0)的代码捕获我想要处理的信号。当我这样做的时候,包装器也会再次收到信号(作为会话的领导者和进程组的内部),然后无尽的循环随之发生 我正在考虑设置某种标志(已经处理了\u sig\u X),并在调用kill之前咨询它,但是(a)它看起来很笨重,(b)何时

我正在为一组子进程编写一个包装器,我想响应一些信号并将它们传播给子进程。因此,例如,如果包装器接收到
QUIT
,它应该将
QUIT
发送给所有子进程(不仅是直接子进程,而且是生成的所有进程)

因此,我使用
setsid
,然后用一个只发出
kill(sig,0)
的代码捕获我想要处理的信号。当我这样做的时候,包装器也会再次收到信号(作为会话的领导者和进程组的内部),然后无尽的循环随之发生

我正在考虑设置某种标志(
已经处理了\u sig\u X
),并在调用
kill
之前咨询它,但是(a)它看起来很笨重,(b)何时删除标志

顺便说一句:实现语言是Ruby,所以如果你想用Ruby编写示例,我会很感激,否则-不用麻烦,我可以处理C

以下是我当前的(幼稚的)实现:

def run_stuff(cmd)
  fork do
    Process.setsid
    trap(:QUIT) { Process.kill(:QUIT, 0) }
    trap(:TERM) { Process.kill(:TERM, 0) }
    IO.popen(cmd) do |io|
      while line = io.gets
        $log.warn line
      end
    end
  end
end

最后,我只是设置了一个标志来忽略其他信号。应修改上述示例代码,以便:

def run_stuff(cmd)
  fork do
    Process.setsid
    shuttingdown = false
    trap(:QUIT) do
      next if shuttingdown
      shuttingdown = true
      Process.kill(:QUIT, 0)
    end
    trap(:TERM) do
      next if shuttingdown
      shuttingdown = true
      Process.kill(:TERM, 0)
    end
    IO.popen(cmd) do |io|
      while line = io.gets
        $log.warn line
      end
    end
  end
end