千家信息网

Ruby信号处理的方法

发表于:2026-11-02 作者:千家信息网编辑
千家信息网最后更新 2026年11月02日,这篇文章主要介绍"Ruby信号处理的方法"的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇"Ruby信号处理的方法"文章能帮助大家解决问题。Ruby使用Proces
千家信息网最后更新 2026年11月02日Ruby信号处理的方法

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

Ruby使用Process.kill发送信号

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

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

  • 如果目标pid>0,表示发送信号给指定PID的进程

  • 如果目标pid=0,表示发送信号给调用kill的进程所在进程组的所有进程

  • 如果目标pid<0,表示按照操作系统的规则发送信号。对于Linux来说:

    • 如果pid=-1,表示发送信号给除pid=1的init进程外的所有进程,当然,没有权限的进程将不受影响

    • 如果pid<-1,表示发送信号给-pid所在进程组的所有进程,例如-3000表示发送信号给pid=3000的进程所在进程组的所有进程

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

  • 信号可以是字符串格式的信号名或数值格式的信号ID,INT或SIGINT或1都是有效的信号

  • 如果信号带有负号(如-2或-INT),表示发送信号给进程所在进程组而非指定的进程(Linux不支持带负号的信号)

  • 如果信号为0,表示探测是否能发送信号给目标进程,可探测是否能管理目标进程或者探测目标进程是否存活

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

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

Ruby中使用Kernel.trap或Signal.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的第二个参数或语句块是捕获到信号后执行的代码。第二个参数有几种特殊情况:

  • 如果第二个参数为字符串IGNORE或SIG_IGN,表示忽略本次捕获的信号

  • 如果第二个参数为字符串DEFAULT或SIG_DFL,表示按照Ruby的默认处理规则来处理

  • 如果第二个参数为字符串EXIT,表示以退出状态码0退出当前进程

  • 如果第二个参数为字符串SYSTEM_DEFAULT,表示按照系统的默认信号处理规则来处理,即以退出状态码141退出进程

避免信号覆盖

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

这时,应该利用好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: #new Thread: #Signal: #=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信号处理的方法"的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识,可以关注行业资讯频道,小编每天都会为大家更新不同的知识点。

信号 进程 处理 信号处理 程序 参数 字符 字符串 目标 所在 方法 线程 名称 多个 知识 第一次 规则 探测 特殊 对象 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 蓝思科技飞鸽互联网 北京路客互联网科技有限公司 互联网与科技发展 青岛互联网科技公司 兼蜜互联网科技 广西拼得多互联网科技有限公司 随着互联网科技发展 欧洲十大科技互联网公司 受益于互联网科技的高速发展 杭州壁岐互联网科技有限公司 互联网科技和法律行业 互联网金融科技名词解释 烟台灵鸽互联网科技有限公司 无锡工业互联网科技有限公司 互联网营销推广黑科技 广东鹅鹅鹅互联网科技有限公司 广州梦谷互联网科技有限公司领导 互联网高科技行业有哪些企业 艺电能源互联网科技有限公司招聘 科技美学互联网 艺术 互联网科技公司起名 互联网公司 科技公司 百单互联网科技有限公司 深圳育鹏互联网科技有限公司招聘 科技大学互联网 电子商务与互联网科技的关系 广州燕处互联网科技有限公司 互联网科技新闻 第三届互联网大会安防黑科技 互联网科技创新创业项目
0