Python 系统调用和信号处理程序

Python 系统调用和信号处理程序,python,linux,signals,system-calls,Python,Linux,Signals,System Calls,我有一个用select阻止读取的程序,但我希望它能通过发送SIGINT信号优雅地返回。并用处理器处理该信号。不幸的是,块程序没有从select系统调用返回,而是接收SIGINT和interupt。 有人能帮我找出问题出在哪里吗?非常感谢 import select import socket import signal class Test(object): def __init__(self): self._read, self._write = socket.soc

我有一个用select阻止读取的程序,但我希望它能通过发送SIGINT信号优雅地返回。并用处理器处理该信号。不幸的是,块程序没有从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.'

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

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.'

请参阅此文件,谢谢您的帮助,但此文件并不能帮助我解决问题。我只是好奇,为什么select不会收到操作系统关于readalbe fds的通知,而是会收到interuppt signal instand:(