2010-11-29 6 views
1

は、私は次のプログラムを持っている:次のシグナル処理の動作をPythonで説明できますか?

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

シグナルが到着したときにシステムコールが実行されている場合、システムコールはinterruptedです。私はこれが部分的にエスカレーション攻撃を防ぐことと、シグナルハンドラが呼び出されたときのプロセスを一貫した状態に保つことが一部であると考えています。また、システムコールに掛かっているプロセスを起動することもできます。

signal.signal(signal.SIGHUP, handler) 
signal.siginterrupt(signal.SIGHUP, false) 
:代わりに、システム再起動するには

は、信号が処理された後、あなたがシグナルハンドラを設定した後、signal.siginterruptを使用して呼び出します

関連する問題