linux开发中,通常会在进程中设置专门的信号处理方法,比如经常使用的CTRL+C,KILL等信号.如果你熟悉liunx编程,那么python等信号处理方法对你来说就很简单,下面的内容将主要介绍python 中singal包的使用.

一、signal使用实例
import signal, os

def handler(signum, frame):
print 'Signal handler called with signal', signum
raise IOError("Couldn't open device!") # Set the signal handler and a 5-second alarm
signal.signal(signal.SIGALRM, handler)
signal.alarm(5) # This open() may hang indefinitely
fd = os.open('/dev/ttyS0', os.O_RDWR) signal.alarm(0) # Disable the alarm

这段代码是python官网提供的实例代码,现在还不明白没关系,接着向下看.

二、signal定义和使用
signal包中,提供了对信号处理接口和定义的各种信号量.
sihnal.signal(signalnumhandler)接口可以向系统注册处理的信号和要处理的操作, signalnum为要处理的信号,可以为SIGNNT、SIGNQUIT等信号,hander为捕获到信号后的处理方法,可以使用signal中的默认处理标志(SIG_DFL)或者忽略(SIG_IGN).也可以自定义操作.实例如下:
#!/usr/bin/python
#coding:utf-8
import signal,os
def signal_fun(signum,frame):
print 'recv signal:%d' % signum if __name__ == '__main__':
signal.signal(signal.SIGINT, signal_fun)
signal.pause()

signal_fun接口就是接收到信号后自定义的处理方法,signal.pause()调用后,会使进程一直阻塞,直到接收到处理信号,处理完成后退出.

上面的脚本使用python sign.py运行后,会一直阻塞在signal.pause(),当输入ctrl+c后,脚本会接收到信号,然后打印信号类型,并结束运行,实际的编码过程中可以在主程序的main函数中预先注册需要处理的的信号.并使用默认的处理逻辑,满足实际的需要.使用的场景主要是:
1、设置标志让进程退出.进程在循环处理任务时不能够使用kill-9.这样会破坏进程的正常处理流程,使用kill时要等任务处理完才会退出,有时候等待的时间会比较久,因此,实际使用时,可以在接收信号后,设置进程退出标示,等当前事务处理完,判断退出标示,然后正常退出进程.
2、忽略某些信号,linux信号处理机制可以帮助我们做很多事情,但是遇到不想处理的信号时需要将其过滤,只处理需要使用的信号
 
三、定时发送信号
回到第一个问题,看如下案例:
运行脚本,脚本调用signal.alarm(5)5秒后给自身发送一个alarm信号,然后进程被阻塞,5秒后,进程收到自身给自身发送的信号,处理退出.alarm参数为0时,默认失效.
 
四、总结

signal.SIG* 各种信号表示

signal.signal(signum,frame) 注册信号

signal.pause() 堵塞信号

signal.alarm() 发送告警信号

python 信号处理的更多相关文章

  1. 使用 scipy.fft 进行Fourier Transform:Python 信号处理

    摘要:Fourier transform 是一个强大的概念,用于各种领域,从纯数学到音频工程甚至金融. 本文分享自华为云社区<使用 scipy.fft 进行Fourier Transform:P ...

  2. Python 信号处理 signal 模块

    Table of Contents 1. signal模块简介 1.1. signal简单示例 1.2. signal说明 1.2.1. 基本的信号名 1.2.2. 常用信号处理函数 2. signa ...

  3. 用GDB排查Python程序故障

        某Team在用Python开发一些代码,涉及子进程以及设法消除僵尸进程的需求.实践中他们碰上Python程序非预期退出的现象.最初他们决定用GDB调试Python解释器,查看exit()的源头 ...

  4. python学习笔记——信号模块signal

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

  5. Python网络编程(进程通信、信号、线程锁、多线程)

    什么是进程通讯的信号? 用过Windows的我们都知道,当我们无法正常结束一个程序时, 可以用任务管理器强制结束这个进程,但这其实是怎么实现的呢? 同样的功能在Linux上是通过生成信号和捕获信号来实 ...

  6. 处理python中的信号

    什么是信号 信号(signal)-- 进程间通讯的一种方式,也可作为一种软件中断的方法.一个进程一旦接收到信号就会打断原来的程序执行来按照信号进行处理. 简化术语,信号是一个事件,用于中断运行功能的执 ...

  7. 用Python进行语音信号处理

    1.语音信号处理之时域分析-音高追踪及其Python实现 2.语音信号处理之时域分析-音高及其Python实现 参考: 1.NumPy

  8. Python中的音频和数字信号处理(DSP)

    翻译自Python For Engineers. 1. 创建一个正弦波 在这个项目中,我们将创建一个正弦波,并将其保存为wav文件. 但在此之前,你应该知道一些理论. 频率:频率是正弦波重复一秒的次数 ...

  9. python做语音信号处理

    音频信号的读写.播放及录音 标准的python已经支持WAV格式的书写,而实时的声音输入输出需要安装pyAudio(http://people.csail.mit.edu/hubert/pyaudio ...

随机推荐

  1. mkfs -t ext3 错误/dev/sdxx is apparently in use by the system; 解决方法

     在存储上共享了一个500G的空间,映射到Linux系统提供上,环境由2个节点组成. 一. 测试一: 直接mount 用fdisk 格式化之后如下: [root@rac1 u01]# fdisk ...

  2. C#的动态链接库和XML配置

    今天对昨天的实例进行了改进和提高,将堆排序和冒泡排序封装在一个动态链接库中,提供函数调用和事件委托.此外加入XML进行配置,在XML中存入相关配置信息,提供一个单独的XmlClass对其进行操作,加深 ...

  3. 省市县从数据库读出来的list数据转换成json格式的数据

    一,数据源 1.1,数据库查出来的数据是 两张表先各自左外连接,然后在相互左外连接查找省市县的数据(业务需求必须这样做,省市去的是第一张表,而市县取的是第二张表,两张表中间通过市的名字连接)见这个博文 ...

  4. Linux命令top 详解

    top命令是Linux下常用的性能分析工具,能够实时显示系统中各个进程的资源占用状况,类似于Windows的任务管理器.下面详细介绍它的使用方法. top - 01:06:48 up 1:22, 1 ...

  5. 【BZOJ2998】Problem A(动态规划)

    [BZOJ2998]Problem A(动态规划) 题面 BZOJ 题解 一个人的成绩范围可以确定为一个区间 这样就变成了 选择若干区间,不重合, 每个区间有个权值,求最大权值和 这样就可直接\(dp ...

  6. 【BZOJ4571】美味(主席树)

    [BZOJ4571]美味(主席树) 题面 Description 一家餐厅有 n 道菜,编号 1...n ,大家对第 i 道菜的评价值为 ai(1≤i≤n).有 m 位顾客,第 i 位顾客的期 望值为 ...

  7. [BZOJ3275] Number (网络流)

    Description 有N个正整数,需要从中选出一些数,使这些数的和最大. 若两个数a,b同时满足以下条件,则a,b不能同时被选 1:存在正整数C,使a*a+b*b=c*c 2:gcd(a,b)=1 ...

  8. Nginx负载均衡——基础功能

    熟悉Nginx的小伙伴都知道,Nginx是一个非常好的负载均衡器.除了用的非常普遍的Http负载均衡,Nginx还可以实现Email,FastCGI的负载均衡,甚至可以支持基于Tcp/UDP协议的各种 ...

  9. SpringMVC常用注解整理

    一.组件型注解: @Component 在类定义之前添加@Component注解,他会被spring容器识别,并转为bean. @Repository 对Dao实现类进行注解 (特殊的@Compone ...

  10. Kafka最佳实践

    一.硬件考量 1.1.内存 不建议为kafka分配超过5g的heap,因为会消耗28-30g的文件系统缓存,而是考虑为kafka的读写预留充足的buffer.Buffer大小的快速计算方法是平均磁盘写 ...