作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明。谢谢!

在了解了Linux的信号基础之后,Python标准库中的signal包就很容易学习和理解。signal包负责在Python程序内部处理信号,典型的操作包括预设信号处理函数,暂停并等待信号,以及定时发出SIGALRM等。要注意,signal包主要是针对UNIX平台(比如Linux, MAC OS),而Windows内核中由于对信号机制的支持不充分,所以在Windows上的Python不能发挥信号系统的功能。

定义信号名

signal包定义了各个信号名及其对应的整数,比如

importsignalprintsignal.SIGALRMprint signal.SIGCONT

Python所用的信号名和Linux一致。你可以通过

$man 7 signal

查询

预设信号处理函数

signal包的核心是使用signal.signal()函数来预设(register)信号处理函数,如下所示:

singnal.signal(signalnum, handler)

signalnum为某个信号,handler为该信号的处理函数。我们在信号基础里提到,进程可以无视信号,可以采取默认操作,还可以自定义操作。当handler为signal.SIG_IGN时,信号被无视(ignore)。当handler为singal.SIG_DFL,进程采取默认操作(default)。当handler为一个函数名时,进程采取函数中定义的操作。

importsignal#Define signal handler function

defmyHandler(signum, frame):print('I received:', signum)#register signal.SIGTSTP's handlersignal.signal(signal.SIGTSTP, myHandler)

signal.pause()

print('End of Signal Demo')

在主程序中,我们首先使用signal.signal()函数来预设信号处理函数。然后我们执行signal.pause()来让该进程暂停以等待信号,以等待信号。当信号SIGUSR1被传递给该进程时,进程从暂停中恢复,并根据预设,执行SIGTSTP的信号处理函数myHandler()。myHandler的两个参数一个用来识别信号(signum),另一个用来获得信号发生时,进程栈的状况(stack frame)。这两个参数都是由signal.singnal()函数来传递的。

上面的程序可以保存在一个文件中(比如test.py)。我们使用如下方法运行:

$python test.py

以便让进程运行。当程序运行到signal.pause()的时候,进程暂停并等待信号。此时,通过按下CTRL+Z向该进程发送SIGTSTP信号。我们可以看到,进程执行了myHandle()函数, 随后返回主程序,继续执行。(当然,也可以用$ps查询process ID, 再使用$kill来发出信号。)

(进程并不一定要使用signal.pause()暂停以等待信号,它也可以在进行工作中接受信号,比如将上面的signal.pause()改为一个需要长时间工作的循环。)

我们可以根据自己的需要更改myHandler()中的操作,以针对不同的信号实现个性化的处理。

定时发出SIGALRM信号

一个有用的函数是signal.alarm(),它被用于在一定时间之后,向进程自身发送SIGALRM信号:

importsignal#Define signal handler function

defmyHandler(signum, frame):print("Now, it's the time")exit()#register signal.SIGALRM's handler

signal.signal(signal.SIGALRM, myHandler)

signal.alarm(5)whileTrue:print('not yet')

我们这里用了一个无限循环以便让进程持续运行。在signal.alarm()执行5秒之后,进程将向自己发出SIGALRM信号,随后,信号处理函数myHandler开始执行。

发送信号

signal包的核心是设置信号处理函数。除了signal.alarm()向自身发送信号之外,并没有其他发送信号的功能。但在os包中,有类似于linux的kill命令的函数,分别为

os.kill(pid, sid)

os.killpg(pgid, sid)

分别向进程和进程组(见Linux进程关系)发送信号。sid为信号所对应的整数或者singal.SIG*。

实际上signal, pause,kill和alarm都是Linux应用编程中常见的C库函数,在这里,我们只不过是用Python语言来实现了一下。实际上,Python 的解释器是使用C语言来编写的,所以有此相似性也并不意外。此外,在Python 3.4中,signal包被增强,信号阻塞等功能被加入到该包中。我们暂时不深入到该包中。

总结

signal.SIG*

signal.signal()

signal.pause()

signal.alarm()

python信号处理库_Python标准库07 信号 (signal包,部分os包)(转载)相关推荐

  1. python的标识库和第三方库_Python 标准库、第三方库

    Python数据工具箱涵盖从数据源到数据可视化的完整流程中涉及到的常用库.函数和外部工具.其中既有Python内置函数和标准库,又有第三方库和工具.这些库可用于文件读写.网络抓取和解析.数据连接.数清 ...

  2. python语音识别的第三方库_python标准库+内置函数+第三方库: 7.音频处理

    python标准库+内置函数+第三方库 欲善其事,必先利其器 这其器必是python的标准库+内置函数,话说许多第三方库, 也是对标准库的使用,进行封装,使得使用起来更方便. 这些库以使用场景来分类: ...

  3. print python 带回车_python标准库threading源码解读【二】

    紧接着上一篇文章继续解析源码 甘蔗:python标准库threading源码解读[一]​zhuanlan.zhihu.com 目录 Event的介绍和用法 Event源码解析 以后的内容尽量少一点并且 ...

  4. python字符串库函数_Python标准库概览(1):string

    Python的 string 标准库保留了一些有用的函数和用于处理文本对象的类,现在我们来一起看一下Python的string标准库还有哪些我们不知道的有趣用法? 01.capwords()函数:将字 ...

  5. python的threading库_python标准库介绍——31 threading 模块详解

    threading 模块 (可选) ``threading`` 模块为线程提供了一个高级接口, 如 [Example 3-1 #eg-3-1] 所示. 它源自 Java 的线程实现. 和低级的 ``t ...

  6. python自带sqlite库_Python标准库之sqlite3使用实例

    Python自带一个轻量级的关系型数据库SQLite.这一数据库使用SQL语言.SQLite作为后端数据库,可以搭配Python建网站,或者制作有数据存储需求的工具.SQLite还在其它领域有广泛的应 ...

  7. python groupby用法_Python 标准库实践之合并字典组成的列表

    作者 | 陈祥安 来源 | Python学习开发 最近做了个数据合并的需求这里记录下: 要求如下: dict_of_list1 = [{"name": "zhangsan ...

  8. python lib库_python标准库pathlib常见操作

    pathlib-- 面向对象的文件系统路径 它是python3.4新增的一个标准库,提供了不同操作系统下文件系统路径的操作方式,有两大类一个是纯路径不带I/0操作,另一个可以进行I/0的类.pathl ...

  9. python argparse库_python标准库之argparse

    argparse的使用 argparse 是 Python 内置的一个用于命令项选项与参数解析的模块,通过在程序中定义好我们需要的参数,argparse 将会从 sys.argv 中解析出这些参数,并 ...

最新文章

  1. SQL Server Integration Services 包的开发与部署初探
  2. python怎样将list转化成字典_在python 中如何将 list 转化成 dictionary
  3. 我的敏捷生活(1)--where am I
  4. 搜索、推荐、广告中的曝光偏差问题
  5. LINUX下截图快捷方式
  6. phaser H5游戏框架的学习相关推荐教程
  7. ieee期刊的科技写作思路曹文平_如何写好一篇高质量的IEEE/ACM Transaction级别的计算机科学论文?...
  8. Deepin Linux禁用笔记本自带键盘
  9. linux播放器安装包下载地址,linux安装MPLAYER播放器
  10. gitlab 配置企业微信邮箱发送邮件
  11. 揭晓丨易知微吉祥物WEI WEI IP形象设计大赛获奖作品出炉
  12. Ubuntu使用cmake出现Performing Test CMAKE_HAVE_LIBC_PTHREAD - Failed
  13. 阿里云全站加速在游戏行业的最佳实践
  14. python list diff_PythonList交集,并集,差集的应用
  15. linux 4g 拨号,4G模块Linux PPP拨号说明
  16. (附源码)spring boot社区养老医疗服务平台 毕业设计 041148
  17. MySQL查询之分组查询
  18. Android 集成高德地图SDK
  19. 【转】每个程序员应该阅读的10本经典书籍
  20. (1)Proteus 8.9上的STM32仿真系列(HAL)---流水灯

热门文章

  1. 七年级下计算机授课计划,七年级下学期信息技术教学计划
  2. 【SSRF技巧拓展】————2、SSRF攻击实例解析
  3. python实现gabor滤波器提取纹理特征 提取指静脉纹理特征
  4. HTML特殊字符编码对照表(最全特殊字符编码)
  5. Java输出hellow world
  6. Thinkpad win11截图快捷键win + sihft +s无反应
  7. UML---序列图和协作图
  8. 微信内测新版本,「漂流瓶」这次真的要去流浪了
  9. OpenCV2学习笔记(十六):Stitching图像拼接
  10. 李宇春男朋友被曝光,藏得真好,这都快结婚了才透露!