如何取消Signal.trap?临时修改中断行为后恢复默认行为
Ruby临时修改INT信号并恢复默认行为
你的问题核心是没搞对Signal.trap恢复默认行为的正确用法,直接把保存的原处理标识作为参数传给Signal.trap就行,不用包在块里。
先看修正后的完整代码:
stop = false # 保存原信号处理行为,这里返回"DEFAULT"(默认INT信号的处理标识) original_trap = Signal.trap('INT') { stop = true } loop do puts "循环运行中,按Ctrl+C触发停止" sleep 1 break if stop end # 恢复默认信号处理:直接传入保存的original_trap Signal.trap('INT', original_trap) puts "已恢复INT信号默认行为,现在按Ctrl+C会直接退出程序" # 可以加这段测试恢复效果 loop do puts "测试恢复后的信号响应..." sleep 1 end
关键说明:
- 调用
Signal.trap('INT', 处理逻辑)时,方法会返回原信号的处理标识:如果之前是默认行为,返回字符串"DEFAULT";如果是自定义Proc,就返回那个Proc。 - 恢复时不需要写块,直接把这个标识作为第二个参数传给
Signal.trap,Ruby就会自动恢复对应的信号处理行为。 - 你之前写的
Signal.trap('INT') { trap }是错误的,因为这相当于给INT信号绑定了一个新的块,块里执行trap变量(也就是字符串"DEFAULT"),这完全不是恢复默认行为的逻辑。
如果你的场景中原来的信号处理不是默认(比如之前有自定义的处理函数),这个方法同样适用,因为original_trap会保存原处理的Proc,恢复时传入即可。
内容的提问来源于stack exchange,提问作者patrick
相关产品推荐
相关产品推荐

