四、Python Signal 信号

信号的概念

信号(signal)--     进程之间通讯的方式,是一种软件中断。一个进程一旦接收到信号就会打断原来的程序执行流程来处理信号。

几个常用信号:

SIGINT     终止进程  中断进程  (control+c)

SIGTERM   终止进程     软件终止信号

SIGKILL   终止进程     杀死进程

SIGALRM 闹钟信号

 

进程结束信号 SIGTERM和SIGKILL的区别

SIGTERM比较友好,进程能捕捉这个信号,根据您的需要来关闭程序。在关闭程序之前,您可以结束打开的记录文件和完成正在做的任务。在某些情况下,假如进程正在进行作业而且不能中断,那么进程可以忽略这个SIGTERM信号。

对于SIGKILL信号,进程是不能忽略的。这是一个 “我不管您在做什么,立刻停止”的信号。假如您发送SIGKILL信号给进程,Linux就将进程停止在那里。

 

发送信号一般有两种原因:

1(被动式)  内核检测到一个系统事件.例如子进程退出会像父进程发送SIGCHLD信号.键盘按下control+c会发送SIGINT信号

2(主动式)  通过系统调用kill来向指定进程发送信号


操作系统规定了进程收到信号以后的默认行为

但是,我们可以通过绑定信号处理函数来修改进程收到信号以后的行为

有两个信号是不可更改的SIGTOP和SIGKILL

绑定信号处理函数

import os  
import signal  
from time import sleep  
   
def onsignal_term(a,b):  
    print '收到SIGTERM信号'  
   
#这里是绑定信号处理函数,将SIGTERM绑定在函数onsignal_term上面  
signal.signal(signal.SIGTERM,onsignal_term)  
   
def onsignal_usr1(a,b):  
    print '收到SIGUSR1信号'  
#这里是绑定信号处理函数,将SIGUSR1绑定在函数onsignal_term上面  
signal.signal(signal.SIGUSR1,onsignal_usr1)  
   
while 1:  
    print '我的进程id是',os.getpid()  
    sleep(10)  

运行该程序。然后通过另外一个进程来发送信号。

发送消息的代码如下:
import os  
import signal  
   
#发送信号,16175是前面那个绑定信号处理函数的pid,需要自行修改  
os.kill(16175,signal.SIGTERM)  
#发送信号,16175是前面那个绑定信号处理函数的pid,需要自行修改  
os.kill(16175,signal.SIGUSR1) 

使用信号需要特别注意的地方:

如果一个进程收到一个SIGUSR1信号,然后执行信号绑定函数,第二个SIGUSR2信号又来了,第一个信号没有被处理完毕的话,第二个信号就会丢弃。

所以,尽量不要在多线程中使用信号。

这个不妥,测试没发现有信号丢失

例子演示:

接收信号的程序,你会发现如果有另外一端使用多线程向这个进程发送信号,会遗漏一些信号。




  • 7
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: signal模块提供了一种将信号发送到Python程序中的方法,它可以在外部事件发生时调用特定的函数。signal.signal函数接受两个参数:信号的数字标识符和要调用的函数。例如,要设置SIGINT(中断进程)信号,可以使用以下代码:signal.signal(signal.SIGINT, my_handler)。 ### 回答2: 在Python中,signal.signal()函数用于设置信号处理函数,即在程序中捕捉到特定信号时执行指定操作。这个函数的基本用法如下: 首先,需要导入signal模块: ```python import signal ``` 然后,我们可以定义一个函数来处理信号,这个函数通常需要带有两个参数(一个是信号编号,一个是当前调用的栈帧): ```python def signal_handler(signal, frame): # 执行特定操作 print('接收到信号') ``` 接下来,使用signal.signal()函数来设置信号处理函数: ```python signal.signal(signal.SIGUSR1, signal_handler) ``` 其中,signal.SIGUSR1是定义的一个信号常量,代表用户自定义的信号1,可以根据需要替换为其他信号常量。signal_handler是我们自定义的信号处理函数。 最后,可以通过发送信号来触发信号处理函数的执行: ```python import os os.kill(os.getpid(), signal.SIGUSR1) ``` 上述代码会向当前进程发送一个SIGUSR1信号,从而触发相应的信号处理函数的执行。在这个例子中,会打印出"接收到信号"的消息。 需要注意的是,Python信号处理函数默认情况下只在主线程中执行。如果需要在子线程中处理信号,需设置线程信号函数的特殊标志: ```python signal.signal(signal.SIGUSR1, signal.SIG_IGN) # 忽略信号 signal.signal(signal.SIGUSR1, signal.SIG_DFL) # 使用默认处理函数 ``` 总之,signal.signal()函数能够让我们在Python中捕捉和处理各种信号,使得程序的执行更加灵活和可控。 ### 回答3: 在Python中,signal模块提供了signal.signal函数,用于设置信号处理程序。其用法如下: 首先,需要导入signal模块: import signal 然后,定义一个信号处理函数,该函数用于处理接收到的信号。函数的参数是信号编号以及当前堆栈的帧对象: def signal_handler(signal, frame): print('接收到信号') 接下来,使用signal.signal函数来设置信号处理程序。该函数有两个参数,第一个参数是要处理的信号编号,而第二个参数是信号处理函数: signal.signal(signal.SIGINT, signal_handler) 在这个例子中,我们将SIGINT信号(也就是Ctrl+C组合键)与signal_handler函数关联起来。当接收到SIGINT信号时,程序将调用signal_handler函数。 最后,我们可以通过调用signal.pause函数来使程序进入等待状态,等待信号的到来: signal.pause() 总结起来,使用signal.signal函数需要三个步骤:导入signal模块、定义信号处理函数、以及使用signal.signal函数设置信号处理程序。这样,程序就可以在接收到指定信号时调用特定的处理函数来进行相应的操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值