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

问题描述:

我正在为一组子进程编写包装,我想对某些信号作出响应并将它们传播给子进程。例如,如果包装收到QUIT,它应该发送QUIT给所有的孩子(不仅是直接的孩子,而且所有的过程都会产生)。忽略发送到我自己的进程组的信号

因此,我使用setsid,然后捕获我想处理的信号,其代码是kill(sig, 0)。当我这样做时,包装器也会再次获取信号(作为会话负责人和进程组内部),并产生无限循环。

我正在考虑设置某种标志(already_handled_sig_X)并在拨打kill之前咨询它,但(a)它看起来很笨重,(b)我什么时候删除标志?

BTW:实现语言是红宝石,所以如果你想放的例子,感觉就像在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