在Jesse Storimer的优秀书籍Working With Unix Processes中,他建议使用这种方法来捕获信号,同时容纳以前的处理程序:
old_handler = trap(:QUIT) {
# do some cleanup
puts 'All done!'
old_handler.call if old_handler.respond_to?(:call)
}
这永远不会退出。假设前一个处理程序调用{{1}},那很好。但是,如果没有其他信号处理程序,只有默认处理程序呢?我的测试表明,这意味着流程永不退出,因为exit
不提供默认流程(trap
将是字符串old_handler
)。
从书中的前一个例子开始,同时展示其他内容:
"DEFAULT"
因此,如果old_handler = trap(:INT) {
old_handler.call
puts 'This is the second handler'
exit
}
调用old_handler
,程序将退出,我们将永远不需要。但如果没有,我们会照顾exit
。这似乎很好。有点奇怪的是,所有处理程序都必须负责可能成为最终结束程序的人,知道其中只有一个将会出现。
无论如何,假设这是真的,这就是我所提出的可以普遍使用的模式:
exit
这是一个正确的方法吗?我缺少什么?