Python signal 信号模块和进程
2019-07-16 本文已影响0人
河码匠
一、什么是信号
软中断信号(signal,又简称为信号)用来通知进程发生了异步事件。进程之间可以互相通过系统调用
kill
发送软中断信号。内核也可以因为内部事件而给进程发送信号,通知进程发生了某个事件。
注意,信号只是用来通知某进程发生了什么事件,并不给该进程传递任何数据。
1. 进程对信号的处理方法
-
第一种方法:类似中断的处理程序,对于需要处理的信号,进程可以指定处理函数,由该函数来处理。
-
第二种方法:忽略某个信号,对该信号不做任何处理,就象未发生过一样。
-
第三种方法:对该信号的处理保留系统的默认值,这种缺省操作,对大部分的信号的缺省操作是使得进程终止。进程通过系统调用
signal
来指定进程对某个信号的处理行为。
------ 以上来自百度百科 ------
2. 查询信号 kill -l
3. 给进程发信号 kill -信号值 pid
二、Python signal 信号模块
1. 常见的信号类型
信号名 | 描述 |
---|---|
signal.SIGHUP | 连接挂断,一般是在用户终端连接结束时发出。 |
signal.SIGILL | 非法指令,在进程试图执行一些非法指令时(比如可执行文件发生错误)发出 |
signal.SIGINT | 终止进程(ctrl + c) |
signal.SIGTSTP | 暂停进程(ctrl + z) |
signal.SIGKILL | 特殊信号,杀死一个进程。这个不能被堵塞、处理或忽略 |
signal.SIGSTOP | 特殊行啊,暂停一个进程。这个不能被堵塞、处理或忽略 |
signal.SIGQUIT | 终端退出(ctrl + \) |
signal.SIGTERM | 终止信号,软件终止信号 |
signal.SIGALRM | 闹钟信号,由 signal.alarm() 发起 |
signal.SIGCONT | 继续执行暂停进程 |
2. 常用的方法
-
signal.alarm(time)
叫做闹钟或者报警器
在 time
(单位秒)时间后终止程序
示例:
#!coding=utf-8
import signal
import time
signal.alarm(5)
for i in range(10):
print i
time.sleep(1)
这里面 signal.alarm(5)
是程序只执行5秒
结果如下
0
1
2
3
4
[Finished in 5.9s with exit code -14]
:在一个进程中只能设置一个 signal. alarm(time)
,如果设置第二个则会覆盖第一个的时间。
-
signal.pause()
暂停进程直到出现一个信号
signal.pause()
会把进程暂停且等待出现任何一个信号后,执行 signal.pause()
后面的语句。
示例
#!coding=utf-8
import signal
import time
signal.alarm(5)
signal.pause()
for i in range(10):
print i
time.sleep(1)
没有信号的情况下,不会执行 for 循环。而且 5 秒后自动结束。
-
signal.signal(sig, handler)
信号处理函数
函数 | 说明 | 参数 |
---|---|---|
signal.signal(sig, handler) |
信号处理函数 | 参数:handler : SIG_IGN :信号被忽略 SIG_DFL : 进程采用默认行为处理 function : 传入一个函数,自定义处理过程 SIGSTOP SIGKILL : 不能处理,只能采用 |
示例:无视 CTRL+C
操作
#!coding=utf-8
import signal
signal.alarm(10)
signal.signal(signal.SIGINT, signal.SIG_IGN)
signal.pause()
在这10秒期间 CTRL+C
无效。10秒后自动关闭。
示例:函数处理信号
#!coding=utf-8
import signal
import time
def func(signum, frame):
if signum == signal.SIGALRM:
print('alarm SIGALRM 信号')
elif signum == signal.SIGINT:
print("CTRL+C SIGINT 信号")
signal.alarm(5)
signal.signal(signal.SIGINT, func)
signal.signal(signal.SIGALRM, func)
while True:
print('循环...')
time.sleep(1)