欢迎光临散文网 会员登陆 & 注册

【python】signal信号处理

2022-01-18 10:02 作者:阿提艾斯  | 我要投稿

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)确实生效了,特意添加了一些打印时间的信息。运行结果如下:

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

官方signal支持windows信号说明

4.2 待续...


5、参考资料

5.1 https://www.cnblogs.com/madsnotes/articles/5688681.html

5.2 https://docs.python.org/3/library/signal.html

【python】signal信号处理的评论 (共 条)

分享到微博请遵守国家法律