Linux下信号和sleep()

今天在写python的过程中碰到一个比较奇怪的问题,先看代码,定义了一个信号,加了一个计时器.

import time
import signal

def catcher(signum,_):
    print "beat !"

signal.signal(signal.SIGALRM, catcher)
signal.setitimer(signal.ITIMER_REAL,1, 2)

while True:
    print "hello"
    time.sleep(5)

程序一执行,输出的结果很奇怪

"hello"
"beat !"
"hello"
"beat !"
....

两个打印是一起进行的,时间间隔都是2秒.按理说应该是5秒打印"hello".但是为什么sleep函数会无效

呢?问了下梁大神,这才知道为什么.sleep函数对于定义过的信号都能触发,简言之就是定义了信号后,

如果这个程序处于sleeping状态,任意信号的输入,都会触发程序.可以通过下面这个测试,通过一个

Ctrl+C信号捕捉.

import time
import signal

def handler(signum,_):
    print "ctrl + c"

signal.signal(signal.SIGINT, handler)

while True:
    print "hello"
    time.sleep(5)
    print "wake up "

运行程序,一旦你按下 ctrl + c 试图终止程序,程序sleeping状态就立马结束,程序会打印"wake up ".

说明程序在sleep状态下是能接收所有的信号的,并且对其做相应的处理

标签:Linux, Python

评论已关闭