该模块为在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中请使用锁。

  目录

  一、signal 模块中的变量

    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 模块中的异常

    signal.ItimerError

  三、signal 模块中的函数

    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_IGNsignal.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_REALsignal.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的更多相关文章

  1. python signal信号

    作用:发送和接收异步系统信号 信号是一个操作系统特性,它提供了一个途径可以通知程序发生了一个事件并异步处理这个事件.信号可以由系统本身生成,也可以从一个进程发送到另一个进程. 由于信号会中断程序的正常 ...

  2. 转:python signal信号

    转自:http://www.jb51.net/article/74844.htm 在liunx系统中要想每隔一分钟执行一个命令,最普遍的方法就是crontab了,如果不想使用crontab,经同事指点 ...

  3. python signal(信号)

    信号的概念 信号(signal)--     进程之间通讯的方式,是一种软件中断.一个进程一旦接收到信号就会打断原来的程序执行流程来处理信号. 几个常用信号: SIGINT     终止进程  中断进 ...

  4. python signal

    在了解了Linux的信号基础之 后,Python标准库中的signal包就很容易学习和理解.signal包负责在Python程序内部处理信号,典型的操作包括预设信号处理函数,暂 停并等待信号,以及定时 ...

  5. python signal模块

    signal包负责在Python程序内部处理信号,典型的操作包括预设信号处理函数,暂 停并等待信号,以及定时发出SIGALRM等.要注意,signal包主要是针对UNIX平台(比如Linux, MAC ...

  6. Python Signal 信号

    https://blog.csdn.net/kongxx/article/details/50976802 http://blog.itpub.net/7728585/viewspace-214206 ...

  7. [Python]再学 socket 之非阻塞 Server

    再学 socket 之非阻塞 Server 本文是基于 python2.7 实现,运行于 Mac 系统下 本篇文章是上一篇初探 socket 的续集, 上一篇文章介绍了:如何建立起一个基本的 sock ...

  8. Python 实现简易 Shell

    什么是shell? (1)shell是一个系统软件,负责用户和操作系统内核之间的交互,是产生进程的进程(通过linux系统调用fork,exec),主要负责解释用户的命令,进而实现用户对进程的控制. ...

  9. 处理python中的信号

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

随机推荐

  1. linux命令(41):文件和文件夹的颜色

    各个颜色的文件分别代表的是:蓝色表示目录:绿色表示可执行文件:红色表示压缩文件:浅蓝色表示链接文件:灰色表示其它文件:红色闪烁表示链接的文件有问题了:黄色是设备文件,包括block, char, fi ...

  2. 使用typed.js实现页面上的写字功能

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  3. User-Defined-Literal自定义字面量

    c++支持多种内置类型的字面量,比如: 123u // unsigned int 1.0 // double 1.6f // float 'a' // char 4ULL // unsigned lo ...

  4. java 多线程 28 : 多线程组件之 Semaphore 信号量

    Semaphore是非常有用的一个组件,它相当于是一个并发控制器,是用于管理信号量的.构造的时候传入可供管理的信号量的数值,这个数值就是控制并发数量的,就是同时能几个线程访问.我们需要控制并发的代码, ...

  5. Commons.net FTPClient 上传文件

    使用 Commons.net FTPClient 上传 文件打不开. 原因,FTPClient 默认使用 ASCII 传输文件,FTP.ASCII_FILE_TYPE; 需要在登录代码后重新指定传输方 ...

  6. Mysql 优化,慢查询

    最近项目上遇到点问题,服务器出现连接超时.上次也是超时,问题定位到mongodb上,那次我修改好了,这次发现应该不是这个的问题了. 初步怀疑是mysql这边出问题了,写的sql没经过压力测试,导致用户 ...

  7. Mysql 替换字段的一部分内容

    UPDATE 表名 SET 字段名= REPLACE( 替换前的字段值, '替换前关键字', '替换后关键字' ) WHERE 字段名 REGEXP "替换前的字段值"; 例子: ...

  8. Linux下如何查看tomcat是否启动,并杀死重启

    在Linux系统下,遇到过这样的问题,项目中使用 ./shutdown.sh 关闭Tomcat失败 Using CATALINA_BASE: /usr/local/tomcat Using CATAL ...

  9. [转]使用DW正则表达式批量替换实例介绍

    原文地址:http://www.jb51.net/Dreamweaver/86329.html 网站优化过程中,经常会遇到很多要批量修改的东西,一个个修改,明显效率低下.本文是使用DW正则表达式批量替 ...

  10. 在IIS中访问APS页面时提示:“最可能的原因使用的托管的处理程序,但是未安装或未完整安装asp.net“

    打开CMD窗口,执行下面的命令: "%WINDIR%\Microsoft.NET\Framework\v4.0.30319\aspnet_regiis.exe" -iru -ena ...