Можете ли вы объяснить следующее поведение обработки сигналов в Python? - PullRequest
1 голос
/ 29 ноября 2010

У меня есть следующая программа:

import socket
import sys
import threading
import signal

class serve(threading.Thread):
    def __init__(self):
        super(serve, self).__init__()
        self.s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        self.host = ''
        self.port = int(sys.argv[1])
    def run(self):
            self.s.bind((self.host, self.port))
            self.s.listen(1)
            conn, addr = self.s.accept()
            # Call blocks in the following recv
            data = conn.recv(1000000)
            conn.close()
            self.s.close()

def handler(signum, frame):
    print "I am the handler: "

signal.signal(signal.SIGHUP, handler)

background = serve()
background.start()
background.join()

Существует клиентская программа, которая подключается к ней, но не отправляет никаких данных. Проблема заключается в том, что при отправке сообщения SIGHUP возникает исключение «Прерванный системный вызов». Есть идеи почему? Это происходит в Python 2.6+ и во FreeBSD. Я подозреваю, что это связано с http://bugs.python.org/issue1975.

1 Ответ

1 голос
/ 29 ноября 2010

Если системный вызов выполняется при поступлении сигнала, системный вызов прерван . Я считаю, что это частично для предотвращения атак эскалации и частично для поддержания процесса в согласованном состоянии при вызове обработчика сигнала. Это также позволит вам разбудить процесс, зависший при системном вызове.

Чтобы вместо этого перезапустить системные вызовы после обработки сигнала, используйте signal.siginterrupt после установки обработчика сигнала:

signal.signal(signal.SIGHUP, handler)
signal.siginterrupt(signal.SIGHUP, false)
...