python signal笔记
简单说明
python signal 模块是对系统进程信号的实现。在进程运行过程中,进程会后台监听信号事件,执行相应的处理函数。例如ctrl+c
键盘中断事件,kill -9
强制杀死进程命令,都是向进程发送相应的信号。每个信号有一个编号和名称。其作用是一样的,在标准库中作为常量定义。
简单使用
import signal
def handler(signum, frame):
# do something
pass
signal.signal(signal.SIGINT, handler)
# 通过信号名称获取对应注册的函数
func = signal.getsignal(signal.SIGTERM)
# 向自身发送SIGARARM信号,避免持续阻塞
signal.alarm(5)
# 暂停进程以等待信号
signal.pause()
注册函数
信号事件处理函数接受两个参数:信号编号和当前的栈帧(stack frame)或None。栈帧的定义和使用详见 https://docs.python.org/3/reference/datamodel.html#frame-objects 。简单的理解,栈帧就是异常打印出来的那堆东西,当执行事件处理函数时,需要知道进程执行到哪一步,所以需要栈帧来判断进程的执行状态。
常用信号
信号 | 名称 | 作用 |
---|---|---|
1 | SIGHUP | 终端挂起或者终止进程。默认动作为终止进程 |
2 | SIGINT | 键盘中断 <ctrl+c> 经常会用到。默认动作为终止进程 |
3 | SIGQUIT | 键盘退出键被按下。一般用来响应 <ctrl+d>。 默认动作终止进程 |
9 | SIGKILL | 强制退出。 shell中经常使用 |
14 | SIGALRM | 定时器超时,默认为终止进程 |
15 | SIGTERM | 程序结束信号,程序一般会清理完状态在退出,我们一般说的优雅的退出 |
备注
需要注意的并非所有信号都可以自定义处理函数或忽略。比较特殊的一点就是强制退出 SIGKILL,因为如果能被重新的定义的话,可能就没办法杀掉进程了。