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

  信号(signal)-- 进程之间通讯的方式,是一种软件中断。一个进程一旦接收到信号就会打断原来的程序执行流程来处理信号。

定义信号名

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

import signal
print(signal.SIGABRT)
print(signal.SIG_DFL) 

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为一个函数名时,进程采取函数中定义的操作。

import signal
import traceback# Define signal handler function
def myHandler(signum, frame):print('I received: ', signum)print(traceback.format_stack(frame))# register signal.SIGTSTP's handler
signal.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信号:

import signal
import traceback# Define signal handler function
def myHandler(signum, frame):print("Now, it's the time")print(traceback.format_stack(frame))exit()# register signal.SIGALRM's handler
signal.signal(signal.SIGALRM, myHandler)
signal.alarm(5)
while True:print('not yet')

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

发送信号

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

os.kill(pid, sid)

os.killpg(pgid, sid)

分别向进程和进程组发送信号。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 信号模块 signal相关推荐

  1. python(10): Signal

    信号Signal 信号Signal的全称为软中断信号,是用来通知进程发生了异步事件,是在软件层次上对中断机制的一种模拟.原理上一个进程收到一个信号与CPU收到一个中断请求可以说是类似的. 信号是进程间 ...

  2. Python编程之Ubuntu下信号模块signal

    参考: python学习笔记--信号模块signal 信号模块是Ubuntu系统下特有的,下面是Ubuntu系统下 signal.SIGHUP # 连接挂断; signal.SIGILL # 非法指令 ...

  3. 浅析Python中signal包的使用

    原文链接:https://www.jb51.net/article/74844.htm 这篇文章主要介绍了Python中signal包的使用,主要在Linux系统下对进程信号进行相关操作,需要的朋友可 ...

  4. python模块—signal

    文章目录 信号 介绍 生命周期 信号处理 信号表示 信号分类 信号通信 常用信号 python signal 信号 介绍 信号signal的全称是软中断信号,是用来通知进程发生的异步事件,是在软件层次 ...

  5. python通信信号处理_python学习笔记——信号模块signal(示例代码)

    基于python学习笔记--多进程间通信--Linux信号基础的学习基础,进一步学习Python标准库中的signal模块. 尽管signal是python中的模块,但是主要针对UNIX平台(比如Li ...

  6. python PyQt5 Signal类 (Signal类提供了一种以pythonic方式声明和连接Qt信号的方法)(connect()、disconnect()、emit())

    https://doc.qt.io/qtforpython/PySide2/QtCore/Signal.html?highlight=connect#PySide2.QtCore.Signal.con ...

  7. python nextpow2_Python signal.hann方法代码示例

    本文整理汇总了Python中scipy.signal.hann方法的典型用法代码示例.如果您正苦于以下问题:Python signal.hann方法的具体用法?Python signal.hann怎么 ...

  8. python之signal操作

    1 信号的意义 在linux系统中信号是与进程通信的一种手段.假设没有信号,linux中的进程一旦运行起来将不再受控,这种局面对于进程的管理来说是一种灾难.kill.ctrl+c等操作本质上就是我们向 ...

  9. 「信号机制」Python信号处理—signal模块

    转载请注明出处:https://blog.csdn.net/jinixin/article/details/80383177 本文是信号机制三篇记录中的第二篇,介绍Python语言中负责信号处理的si ...

最新文章

  1. Power Shell03 在PowerShell 3.0重新启动计算机指令
  2. 使Git与代理服务器一起使用-因“请求超时”而失败
  3. ajax catch,promise记得写上catch
  4. 【LeetCode】4.寻找两个正序数组的中位数
  5. Android之解决Base64 encode中文乱码问题
  6. linux下删除目录及其子目录下某种类型文件
  7. struts2 页面取值_Struts2页面取值 大总结
  8. Eclipse 提示 The given project is not a virtual component project
  9. 40岁,将站到哪里(转)
  10. redis、mysql、和php原生array数组效率对比
  11. TF卡里删掉文件后内存没变大_为何手机存储空间还没用就快满了?删掉这些隐藏冗余文件满血复活...
  12. 拓端tecdat|TensorFlow 2.0 keras开发深度学习模型实例:多层感知器(MLP),卷积神经网络(CNN)和递归神经网络(RNN)
  13. Nginx图片服务器
  14. GBDT算法原理以及实例理解(含Python代码简单实现版)
  15. JavaScript高级程序设计知识点汇总
  16. 学计算机编程笔记本电脑推荐,想选一款笔记本电脑,主要用来学编程,有什么好的推荐吗?...
  17. 计算机硬盘怎么设置ntfs,如何把计算机硬盘文件系统fat32改为ntfs.doc
  18. element ui table样式
  19. 冶金物理化学复习 --- 熔渣的基础理论
  20. LINUX基础知识笔记全

热门文章

  1. Python Module_os_操作系统
  2. 【Ansible】3个让Ansible性能飞起的简单优化方案!
  3. .NET(C#):使用Win32Exception类型处理Win32错误代码
  4. 矩阵LU分解分块算法实现
  5. dhcp配置(个人)
  6. 程序员离职带走源码竟获利800万,网友:我一般都是删库跑路
  7. VERY DEEP CONVOLUTIONAL NETWORKS FOR LARGE-SCALE IMAGE RECOGNTION(翻译)
  8. Sharding-JDBC 1.3.0发布——支持读写分离
  9. LNMP环境搭建(centos6.9+mysql5.7+php7.1+nginx1.10)
  10. 防火墙DNAT与SNAT详谈