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,因为如果能被重新的定义的话,可能就没办法杀掉进程了。

引用

https://juejin.im/post/5c0a4a92f265da61682b2f65

posted @ 2020-05-16 16:47  zhangjpn  阅读(585)  评论(0编辑  收藏  举报