Python——signal
该模块为在Python中使用信号处理句柄提供支持。下面是一些使用信号和他们的句柄时需要注意的事项:
- 除了信号 SIGCHLD 的句柄遵从底层的实现外,专门针对一个信号的句柄一旦设置,除非被明确地重置,会保持被设置的状态。(Python 模拟 BSD 风格的界面,而不论底层的实现)。
- 不能从 critical sections 设法临时阻止信号,因为Unix的风格并不支持这么做。
- 尽管从 Python 用户的角度,Python 的信号句柄被称为异步的,但他们也只能出现在 Python 解释器的“原子”指令之间。如果在以纯 C 书写的长运算正在进行中有信号到达,那么这个信号可能被延迟任意长的时间。
- 当信号在 I/O 操作过程中到来时, I/O 操作可能会在信号句柄返回后抛出异常。这依赖于底层 Unix 关于被打断的系统调用的语义。
- 因为 C 的信号句柄总有返回值,捕获同步的错误比如 SIGFPE 或 SIGSEGV 的意义不大。
- Python 会默认设置一些信号句柄: SIGPIPE 被忽略 (因此管道和套接字上的写错误可以像普通的 Python 异常一样报告) , SIGINT 被转成一个 KeyboardInterrupt 异常。不过这些都是可以覆写的。
- 同一段程序中如果既有线程又有信号,那么就要小心了:总是在执行的主线程中执行 signal() 操作。任何一个 thread 都可以执行 alarm(), getsignal(), pause(),setitimer() 或 getitimer(); 只有 main thread 才能设置一个新的信号句柄,而且只有 main thread 才能够接收信号 (Python 的 signal 模块就是这么规定的,不论底层的线程实现是否允许向独立的线程发送信号)。这意味着信号不能被用来充当线程间的通信手段,在Python中请使用锁。
目录
1. signal.SIG_DFL
2. signal.SIG_IGN
3. SIG*
4. signal.CTRL_C_EVENT
5. signal.CTRL_BREAK_EVENT
6. signal.NSIG
7. signal.ITIMER_REAL
8. signal.ITIMER_VIRTUAL
9. signal.ITIMER_PROF
signal.ItimerError
1. signal.alarm()
2. signal.getsignal()
3. signal.pause()
4. signal.settimer()
5. signal.gettimer()
6. signal.get_wakeup_fd()
7. signal.siginterrupt()
8. signal.signal()
一、signal 模块中的变量:
signal.SIG_DFL
- 这是两个标准信号句柄选项之一,将会执行为信号设置的默认函数。例如,在大多数的系统上对于 SIGQUIT 的默认动作是 dump 内核然后退出,而对于 SIGCHLD 的默认动作是直接无视它。
- signal.SIG_IGN
- 这是两个标准信号句柄选项这种的另一个,直接忽略指定的信号。
- SIG*
- 所有的信号数都以符号常量的形式定义,例如,挂起信号被定义为 signal.SIGHUP,变量名与 C 程序中使用的相同,可以在 <signal.h> 头文件中找到。Unix 对应 ‘signal()‘ 的 man 页面列出了所有已经定义的信号,(有些系统上是 signal(2),有的系统上是 signal(7))。注意不是所有的系统上都定义相同的信号名。
- signal.CTRL_C_EVENT
- 对应于 CTRL+C 击键事件,该信号只能与 os.kill() 一起使用。
- 适用于: Windows.
- Python 2.7 引入
- signal.CTRL_BREAK_EVENT
- 对应 CTRL+BREAK 击键操作,该信号只能与 os.kill() 一起使用。
- 适用于: Windows.
- Python 2.7 引入
- signal.NSIG
- 刚好比最大信号的值大1。
- signal.ITIMER_REAL
- 实时递减定时器,过期时发出 SIGALRM 信号
- signal.ITIMER_VIRTUAL
- 只有当进程正在执行时才递减定时器,过期时发出 SIGVTALRM 信号
- signal.ITIMER_PROF
- 当进程正在执行或系统正在代进程执行时递减定时器,过期时发出 SIGPROF 信号,当与 ITIMER_VIRTUAL 一起使用时,这个定时器通常用来刻画应用在用户空间和内核中所花的时间。
-
二、signal 模块的异常
- signal.ItimerError
- 从底层 setitimer() 或 getitimer() 抛出,用来标志一个错误。该异常在一个无效的计时器或负的时间被传入 setitimer() 时抛出,是 IOError 的子类。
三、signal 模块的函数
signal.alarm(time)
如果参数 time 是非零的,这个函数会请求一个 SIGALRM 信号在 time 秒内发给进程。先前已经调度的 alarm 全部取消 (一次只能调度一个 alarm )。 返回值是先前设置的 alarm 还剩余的秒数。如果 time 是零,不会调度任何 alarm ,而且会取消一切已经调度的 alarm 。如果返回值是零,说明当前没有被调度的 alarm 。(查看 Unix man 手册 alarm(2).)
适用于: Unix
signal.getsignal(signalnum)
返回值是对应于信号 signalnum 的信号句柄,可能是一个Python 可调用对象,或者是 signal.SIG_IGN,signal.SIG_DFL 或 None 中的一个。这里 signal.SIG_IGN 意味着该信号此前被忽略, signal.SIG_DFL 意味着先前使用默认方式处理这个信号, None 意味着先前的信号句柄没有设置。
signal.pause()
造成进程睡眠直到信号到来,合适的句柄到时会被调用,没有返回值,不支持Windows。(查看 Unix man 手册 signal(2))。
signal.setitimer(which, seconds[, interval])
将参数 which 指定的计时器 ( signal.ITIMER_REAL,signal.ITIMER_VIRTUAL 或 signal.ITIMER_PROF 中的一个) 设置为参数 seconds 秒后触发(float 型的也可,不同于 alarm()) ,然后每隔 interval 秒后触发一次。通过将 seconds 设置为0可以清除 which 指定的计时器。
当一个计时器触犯时,一个信号被发送给进程,这个被发送的信号取决于使用的定时器, signal.ITIMER_REAL 会发送 SIGALRM , signal.ITIMER_VIRTUAL 发送 SIGVTALRM, signal.ITIMER_PROF 发送 SIGPROF。
旧值被作为元组返回:(delay, interval)。
传入一个无效的定时器会造成一个 ItimerError
适用于: Unix.
Python 2.6 引入
signal.getitimer(which)
返回参数 which 指定的定时器的当前值。
适用于: Unix.
Python 2.6 引入
signal.set_wakeup_fd(fd)
将唤醒文件描述字设置为参数 fd。当一个信号被接收时,一个 '\0' 字节被写入到指定的 fd 中。 可以被一个一个库用来唤醒一个 poll 或 select 调用,允许信号被完全处理。
返回旧的文件描述字,参数 fd 必须是非阻塞的,是否在再次调用 poll 或 select 之前清除字节记录取决于具体的库。
当允许线程时,该函数只能被主线程调用,其他的线程调用它将会抛出 ValueError 异常。
Python 2.6 引入
signal.siginterrupt(signalnum, flag)
改变系统调用重启规则:如果 flag 是 False, 系统调用将会在被信号 signalnum 打断时重启,否则系统调用将会被打断。没有返回值。
适用于: Unix (查看 man 手册的 siginterrupt(3))
注意当用 signal() 设置一个信号句柄时将会通过隐式调用 siginterrupt() 重置重启行为为可打断,即对于指定的的信号,flag 为 真。
Python 2.6 引入
signal.signal(signalnum, handler)
将信号 signalnum 的句柄设置为函数 handler。 handler 可以是一个 Python 可调用对象,接受两个参数,或 signal.SIG_IGN 和 signal.SIG_DFL 中的一个。该函数将会返回之前的信号句柄,
当允许线程时,该函数只能被主线程调用,其他的线程调用它将会抛出 ValueError 异常。
调用句柄 handler 需要提供两个参数:信号的数值和当前的栈帧 (None 或一个 frame 对象;查阅 description in the type hierarchy 或 inspect 模块中的属性描述可以了解 frame 对象)。
Windows上 signal() 只能用 SIGABRT,SIGFPE,SIGILL,SIGINT,SIGSEGV 或 SIGTERM 调用。 否则会抛出 ValueError 异常。
例子
这里有一个例子,使用 alarm() 函数来限制等待打开一个文件的时间,当文件是为一个不一定会被打开的连续设备准备时很有用,这种情况通常会造成 os.open() 立刻挂起。解决办法是在开文件钱设置一个5秒的 alarm,当打开文件超时时, alarm 信号会被发送,句柄将会抛出一个异常。
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的更多相关文章
- python signal信号
作用:发送和接收异步系统信号 信号是一个操作系统特性,它提供了一个途径可以通知程序发生了一个事件并异步处理这个事件.信号可以由系统本身生成,也可以从一个进程发送到另一个进程. 由于信号会中断程序的正常 ...
- 转:python signal信号
转自:http://www.jb51.net/article/74844.htm 在liunx系统中要想每隔一分钟执行一个命令,最普遍的方法就是crontab了,如果不想使用crontab,经同事指点 ...
- python signal(信号)
信号的概念 信号(signal)-- 进程之间通讯的方式,是一种软件中断.一个进程一旦接收到信号就会打断原来的程序执行流程来处理信号. 几个常用信号: SIGINT 终止进程 中断进 ...
- python signal
在了解了Linux的信号基础之 后,Python标准库中的signal包就很容易学习和理解.signal包负责在Python程序内部处理信号,典型的操作包括预设信号处理函数,暂 停并等待信号,以及定时 ...
- python signal模块
signal包负责在Python程序内部处理信号,典型的操作包括预设信号处理函数,暂 停并等待信号,以及定时发出SIGALRM等.要注意,signal包主要是针对UNIX平台(比如Linux, MAC ...
- Python Signal 信号
https://blog.csdn.net/kongxx/article/details/50976802 http://blog.itpub.net/7728585/viewspace-214206 ...
- [Python]再学 socket 之非阻塞 Server
再学 socket 之非阻塞 Server 本文是基于 python2.7 实现,运行于 Mac 系统下 本篇文章是上一篇初探 socket 的续集, 上一篇文章介绍了:如何建立起一个基本的 sock ...
- Python 实现简易 Shell
什么是shell? (1)shell是一个系统软件,负责用户和操作系统内核之间的交互,是产生进程的进程(通过linux系统调用fork,exec),主要负责解释用户的命令,进而实现用户对进程的控制. ...
- 处理python中的信号
什么是信号 信号(signal)-- 进程间通讯的一种方式,也可作为一种软件中断的方法.一个进程一旦接收到信号就会打断原来的程序执行来按照信号进行处理. 简化术语,信号是一个事件,用于中断运行功能的执 ...
随机推荐
- 缩放图片,解决bitmap 内存溢出out of memory的问题
很多人在android开发中都遇到了生成bitmap时候内存溢出,也就是out of memory(OOM)的问题,网上对这样的问题的的解决说法不一.笔者作为一个初级开发者,在这里向大家提供一种比较实 ...
- 【教程】ubuntu下安装NFS服务器
安装 NFS server mystery@lcw:~$ sudo apt-get install nfs-kernel-server 编辑/etc/exports,添加目标系统的根文件系统映射目录 ...
- flex布局知识点(阮一峰博客)
任何一个容器都可以指定为flex布局: 行内元素也可以使用flex布局: 设为flex布局以后,子元素的float,clear,vertical-align属性都将失效: flex容器的属性: fle ...
- RedHat下安装Python开发环境
Linux RedHat下安装Python2.7.pip.ipython环境.eclipse和PyDev环境 准备工作,源Python2.6备份: 根据which python具体目录而定,进行备份 ...
- 在Mac系统下用STS搭建一个Spring MVC项目
[本文出自天外归云的博客园] 从STS的下载到空项目的搭建 1. 下载STS,下载解压缩后点击sts-bundle文件夹中的STS文件启动ide: 2. 创建Spring MVC项目:File-> ...
- Python如何下载文件
转载自:http://www.codecho.com/how-to-download-a-file-in-python/ 利用程序自己编写下载文件挺有意思的.Python中最流行的方法就是通过Http ...
- 基于jQuery图片弹出翻转特效代码
分享一款基于jQuery图片弹出翻转特效代码.这是一款基于jQuery+HTML5实现的,里面包含六款不同效果的鼠标点击图片弹出特效下载.效果图如下: 在线预览 源码下载 实现的代码. html代 ...
- web开发经验
图片显示不全 网站进行了迁移,更换了新框架,结果出现了图片显示不全的问题,后来发现是nginx权限问题 curl 无报错,无返回 有可能是url错误,而无服务器对错误的url返回空,没返回错误
- Android ListView的使用(三)
前两节关于ListView的,已经使用了ArrayAdapter,SimpleAdapter了,两个比较基本的适配器 这里来用一个用的最多的一个适配器BaseAdapter. 还是先上效果图.大概和微 ...
- 自己定义View-2-重写onMeasure
效果图 布局文件 <?xml version="1.0" encoding="utf-8"? > <LinearLayout xmlns:an ...