【python】signal信号处理
1、模块功能
signal包负责在python程序内部处理信号,典型的操作包括预设信号处理函数,暂停并等待信号,以及定时发出SIGALRM等。
windows和Linux都可以使用signal库,但是部分信号只支持Linux,比如signal.SIGALRM。所以使用signal库时要注意平台。详情可以参考文档:https://docs.python.org/3/library/signal.html
信号是一种进程之间通讯的方式,是一种软件中断。一个进程一旦接收到信号就会打断原来的程序执行流程来处理信号。
2、模块安装
python自带,没有特意安装
3、模块使用
3.1 预设信号处理函数
上述代码含义:当接收到停止终端信号(signal.SIGTSTP),调用处理函数handler,输出信号值和进程栈信息。

由结果可知,接收到的信号值为20(可以参考文章《linux - signal信号》查阅信号名和信号值对应情况),frame值为: <frame at 0xb670fc30, file '1.py', line 12, code <module>>
解释:
signal.signal(signalnum, handler)函数有两个参数:
signalnum: 某个信号,比如signal.SIGTSTP
handler: 信号处理函数。
signal调用hander的时候,会传递两个参数:
signum: 这个就是信号值,也就是signalnum
frame: 这个参数是用来获得信号发生时,进程栈的情况。
3.2 定时发出信号
使用的函数是:signal.alarm()
该函数被用于在一定时间之后,向进程自身发送SIGALRM信号。
代码示例:
上述代码含义:程序运行5秒后向自身发送SIGALRM信号,调用handler函数。主程序运行10秒之后打印信息。为了证明signal.alarm(5)确实生效了,特意添加了一些打印时间的信息。运行结果如下:

由上图输出结果可知:
11:32:37,程序开始运行
11:32:42,handler函数被调用起来了,时间经过了11:32:42 - 11:32:37 = 5秒。说明signal.alarm(5)生效了。
11:32:47,从程序运行,到现在共10秒,接着输出主函数后面的内容。
程序总共耗时10秒钟,由此也可以推断出,signal.alarm()函数不是阻塞式的。
以上程序是在linux上运行的,如果换到windows上运行会报错:
AttributeError: module 'signal' has no attribute 'SIGALRM',原因请参考4.1.

4、遇到的问题
4.1 在windows上运行程序报错:AttributeError: module 'signal' has no attribute 'SIGALRM'
原因:部分信号不支持windows,根据官方文档,windows可使用的信号有:SIGABRT、SIGFPE、SIGILL、SIGINT、SIGSEGV、SIGTERM or SIGBREAK.
https://docs.python.org/3/library/signal.html?highlight=signal#module-signal

4.2 待续...
5、参考资料
5.1 https://www.cnblogs.com/madsnotes/articles/5688681.html
5.2 https://docs.python.org/3/library/signal.html