文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Ruby信号处理的方法

2023-06-30 05:15

关注

这篇文章主要介绍“Ruby信号处理的方法”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Ruby信号处理的方法”文章能帮助大家解决问题。

Ruby使用Process.kill发送信号

Process.kill(signal, pid, ...) → integer

Process.kill发送指定的信号给一个或多个进程或进程组:

Process.kill的第一个参数是要发送的信号:

pid = fork do  sleep 300end# ...Process.kill("HUP", pid)Process.wait

Ruby使用trap()设置信号处理程序

Ruby中使用Kernel.trapSignal.trap捕获信号并设置信号处理程序,这两个trap等价。

可设置多个trap来监控多个信号。

Signal.trap(0, proc { puts "Terminating: #{$$}" })Signal.trap("CLD")  { puts "Child died" }fork && Process.wait=beginTerminating: 27461Child diedTerminating: 27460=end

trap的第一个参数是监控的信号名称,可以是字符串的信号名称(如SIGINT),可以是省略SIG前缀的信号名称(如INT),可以是信号对应的数值(如2)。

Ruby支持一个特殊的信号0(对应的字符串信号名为EXIT或SIGEXIT),表示进程退出时会触发的信号。

trap的第二个参数或语句块是捕获到信号后执行的代码。第二个参数有几种特殊情况:

避免信号覆盖

使用第三方包的时候,有时候不知道这个包是否定义了某个信号的信号处理程序,或者知道它定义了某信号信号处理程序,但自己定义这个信号的信号处理程序时,不想覆盖第三方包中所定义的处理程序。

这时,应该利用好trap的返回值。每一次trap设置信号处理程序时,都返回本信号之前已经定义的信号处理程序(是一个Proc对象)。只是需要注意,有些信号的初始处理程序是一个字符串值DEFAULT而不是一个Proc对象,因此,应该进行类型判断:

# 第一次定义INT的信号处理程序first_trap = trap('INT') {   first_trap.call if first_trap.is_a? Proc  puts "first_trap" }# 第二次定义INT的信号处理程序old_trap = trap('INT') {   old_trap.call if old_trap.is_a? Proc   # 调用第一次定义的信号处理程序  puts "old trap"  # 本次trap时执行的逻辑}# 定义好之后,old_trap为第一次定义的信号处理程序# 之后按下CTRL+C触发INT信号的信号处理程序

多线程信号注册问题

如果是在多线程中注册信号处理程序,该信号处理程序将总是注册在所在进程的main线程中(即使是在其它线程中设置trap())。

pid = fork do  puts "main Thread: #{Thread.current}"  Thread.new {    puts "new Thread: #{Thread.current}"    trap("TERM", proc { puts "Signal: #{Thread.current}" })    sleep 2  }  sleep 2endsleep 1Process.kill 'SIGTERM', pid=beginmain Thread: #<Thread:0x00007fffd6ed4c10 run>new Thread: #<Thread:0x00007fffd714f2b0@a.rb:4 run>Signal: #<Thread:0x00007fffd6ed4c10 run>=end

子进程继承信号处理程序

子进程会从父进程继承信号处理程序。

trap 'TERM', proc { puts "Signal: #{Process.pid}" }puts "Parent: #{Process.pid}"pid = fork do  sleep 30endputs "Child: #{pid}"Process.kill 'TERM', pid=beginParent: 2872Child: 2901Signal: 2901=end

关于“Ruby信号处理的方法”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识,可以关注编程网行业资讯频道,小编每天都会为大家更新不同的知识点。

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     807人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     351人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     314人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     433人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     221人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯