1

次のプログラムがあります。

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に関連していると思われます。

4

1 に答える 1

1

シグナルが到着したときにシステム コールが実行されている場合、システム コールは中断されます。これは、エスカレーション攻撃を防ぐためでもあり、シグナル ハンドラーが呼び出されたときにプロセスを一貫した状態に保つためでもあると思います。また、システム コールでハングしているプロセスを起動することもできます。

代わりに、シグナルが処理された後にシステム コールを再開するにはsignal.siginterrupt、シグナル ハンドラを設定した後に使用します。

signal.signal(signal.SIGHUP, handler)
signal.siginterrupt(signal.SIGHUP, false)
于 2010-11-29T08:37:27.177 に答える