2013-05-29 41 views
1

我有一个程序,阻止与select读取,但我希望它发送一个SIGINT信号优雅地返回。并用处理程序处理该信号。不幸的是,block程序不会从select系统调用返回,而是收到SIGINT和interupt。 有人可以帮我弄清楚是什么问题?非常感谢。系统调用和信号处理程序

import select 
import socket 
import signal 

class Test(object): 
    def __init__(self): 
     self._read, self._write = socket.socketpair() 

    def wait(self): 
     readable = [self._read.fileno()] 
     return select.select(readable, [], readable) 

    def wakeup(self): 
     self._write.send('1') 


t = Test() 

def handler(signum, frame): 
    t.wakeup() 


signal.signal(signal.SIGINT, handler) 

if __name__ == '__main__': 
    print t.wait() 
    print 'over.' 
+0

请参阅本http://stackoverflow.com/questions/2148888/python-trap-all-signals – Antarus

+0

感谢您的帮助,但是这是指不帮我出的疑难问题。只是好奇,为什么选择没有得到os通知readalbe fds,但得到interuppt信号instand :( – user2431104

回答

0

您误解了程序的行为:它确实从选择系统调用返回,但是必须处理错误“中断的系统调用”。

import errno 
import select 
import socket 
import signal 

class Test(object): 
    def __init__(self): 
     self._read, self._write = socket.socketpair() 

    def wait(self): 
     readable = [self._read.fileno()] 
     try: 
     return select.select(readable, [], readable) 
     except select.error as e: 
     if e.args[0] == errno.EINTR: 
       return 
     else: 
       pass 

    def wakeup(self): 
     self._write.send('1') 


t = Test() 

def handler(signum, frame): 
    t.wakeup() 


signal.signal(signal.SIGINT, handler) 

if __name__ == '__main__': 
    print t.wait() 
    print 'over.'