1

selectで読み取りをブロックするプログラムがありますが、SIGINTシグナルを送信して正常に戻りたいです。そのシグナルをハンドラーで処理します。残念ながら、ブロック プログラムは select システム コールから復帰せず、代わりに SIGINT と割り込みを受け取ります。何が問題なのかを理解するのを手伝ってくれる人はいますか? どうもありがとう。

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

1 に答える 1

0

プログラムの動作を誤って解釈しました。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.'
于 2013-05-29T07:12:00.340 に答える