该模块为在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
三、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