信号signal
程序员文章站
2023-12-26 21:36:15
信号的概念 信号(signal)-- 进程之间通讯的方式,是一种软件中断。一个进程一旦接收到信号就会打断原来的程序执行流程来处理信号。 几个常用信号: SIGINT 终止进程 中断进程 (control+c) SIGTERM 终止进程 软件终止信号 SIGKILL 终止进程 杀死进程 SIGALRM ......
信号的概念
信号(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信号又来了,第一个信号没有被处理完毕的话,第二个信号就会丢弃。
所以,尽量不要在多线程中使用信号。
这个不妥,测试没发现有信号丢失
例子演示:
接收信号的程序,你会发现如果有另外一端使用多线程向这个进程发送信号,会遗漏一些信号。