返回顶部
首页 > 资讯 > 精选 >Ruby信号处理的方法
  • 253
分享到

Ruby信号处理的方法

2023-06-30 05:06:16 253人浏览 安东尼
摘要

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

这篇文章主要介绍“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.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的第二个参数或语句块是捕获到信号后执行的代码。第二个参数有几种特殊情况:

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

  • 如果第二个参数为字符串DEFAULTSIG_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: #<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信号处理的方法”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识,可以关注编程网精选频道,小编每天都会为大家更新不同的知识点。

--结束END--

本文标题: Ruby信号处理的方法

本文链接: https://lsjlt.com/news/327406.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Ruby信号处理的方法
    这篇文章主要介绍“Ruby信号处理的方法”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Ruby信号处理的方法”文章能帮助大家解决问题。Ruby使用Process.kill发送信号Process.ki...
    99+
    2023-06-30
  • Ruby信号处理详解
    Ruby使用Process.kill发送信号 Process.kill(signal, pid, ...) → integer Process.kill发送指定的信号给一个或多个进程...
    99+
    2024-04-02
  • Ruby日期转换的处理方法有哪些
    本篇内容主要讲解“Ruby日期转换的处理方法有哪些”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Ruby日期转换的处理方法有哪些”吧!Ruby中Date、Time、 DateTime这3个类提供...
    99+
    2023-06-30
  • Ruby数据存储和处理的方法是什么
    在Ruby中,数据存储和处理的方法通常使用数据库来实现。常用的数据库包括MySQL、PostgreSQL、SQLite等。可以使用O...
    99+
    2024-04-10
    Ruby
  • 「信号机制」Python信号处理—sig
    转载请注明出处:https://blog.csdn.net/jinixin/article/details/80383177   本文是信号机制三篇记录中的第二篇,介绍Python语言中负责信号处理的signal模块,并会给出一些小dem...
    99+
    2023-01-31
    信号处理 信号 机制
  • 【linux】进程信号——信号的保存和处理
    文章目录 一、阻塞信号1.1 信号的相关概念1.2 在内核中的构成 二、捕捉信号概念2.1 内核态和用户态2.2 信号捕捉流程图 三、信号操作3.1 sigset_t信号集3.2 信号集操作函数3.2.1 更改block表s...
    99+
    2023-08-20
    linux 运维 服务器
  • 【Linux从入门到精通】信号(信号保存 & 信号的处理)
      本篇文章接着信号(初识信号 & 信号的产生)进行讲解。学完信号的产生后,我们也了解了信号的一些结论。同时还留下了很多疑问: 上篇文章所说的所有信号产生,最终都要有OS来进行执行,为什么呢?OS是进程的管理者。信号的处理是否是立即...
    99+
    2023-09-29
    运维 linux 信号处理
  • 如何理解Ruby加密方法
    如何理解Ruby加密方法,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。Ruby语言虽然是一个结构比较简单的编程语言,但是其中也有程序加密的功能。在这里我们就以几...
    99+
    2023-06-17
  • linux信号解释(3)--信号处理机制
        如果需要进程捕获某个信号,并作出相应的处理,就需要注册信号处理函数(其实就是内核里需要识别信号函数,类似C语言里的include某函数库)。    处理信号就类似软中断,内核为每个进程准备了一段信号向量表,记录信号的处理机制。当某个...
    99+
    2023-01-31
    信号处理 信号 机制
  • php如何处理信号
    这篇文章将为大家详细讲解有关php如何处理信号,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。我们常用的信号kill   sigterm sigkill【kill命令】ctrl+c sigint【...
    99+
    2023-06-21
  • python 对信号 处理的 测试
     python 对信号 处理的测试 小结下: 每次信号 会将当前执行的函数挂起,进入 信号处理函数 如果信号处理函数还在处理,又来信号,当前函数仍然被挂起 执行完毕回到刚才挂起点继续执行 从下面输出 我们就可以看出来 ...
    99+
    2023-01-31
    信号 测试 python
  • 数字信号处理8:利用Python进行数字信号处理基础
    我前两天买了本MATLAB信号处理,但是很无语,感觉自己对MATLAB的语法很陌生,看了半天也觉得自己写不出来,所以就对着MATLAB自己去写用Python进行的数字信号处理基础,我写了两天左右,基本上把matlab书上的代码全部用Pyth...
    99+
    2023-09-20
    python 信号处理 scipy
  • 信号处理板卡学习资料:基于6UVPX C6678+XCVU9P的信号处理板卡440
    基于6UVPX C6678+XCVU9P的信号处理板卡...
    99+
    2023-06-05
  • sqlserver帐号被禁用的处理方法
    今天就跟大家聊聊有关sqlserver帐号被禁用的处理方法,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。若发现sqlsrver所有帐号不小心被禁用了...
    99+
    2024-04-02
  • python中对信号的处理详解
    目录什么是信号Python的信号处理Python对信号的处理信号枚举信号函数signal.alarm(time)signal.pause()signal.setitimer(whic...
    99+
    2024-04-02
  • PHP进程信号如何处理
    这篇文章主要介绍“PHP进程信号如何处理”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“PHP进程信号如何处理”文章能帮助大家解决问题。一、在Linux操作系统中有哪些信号1、简单介绍信号信号是事件发...
    99+
    2023-07-05
  • golang进程信号怎么处理
    在Go语言中,可以使用`os/signal`包来处理进程信号。下面是一个处理 `SIGINT` 和 `SIGTERM` 信号的示例代...
    99+
    2023-10-26
    golang
  • MYSQL中对信号的处理(SIGTERM,SIGQUIT,SIGHUP等)
    原创,因为LINUX系统编程水平有限某些用词不当请指出 一、信号处理以及多线程先信号处理基础知识 在LINUX中信号是一种由内核处理的一种软中断机制,他满足简单、不能携带大量信息、并且要满足一定条件才会发...
    99+
    2024-04-02
  • Linux协程与信号处理的兼容性
    在Linux系统中,协程与信号处理有一定的兼容性问题。由于协程是一种用户态的轻量级线程,它们通常是由用户程序来实现,而信号处理是由操作系统来处理的。在使用协程时,需要注意以下几点与信号处理的兼容性问题: 阻塞信号:在协程中,如果需要阻塞...
    99+
    2024-08-06
    linux
  • ruby下mysql的安装与配置方法
    本篇内容主要讲解“ruby下mysql的安装与配置方法”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“ruby下mysql的安装与配置方法”吧!ruby on r...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作