2010-11-29 44 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.siginterrupt您设置了信号处理程序后:

signal.signal(signal.SIGHUP, handler) 
signal.siginterrupt(signal.SIGHUP, false) 
相关问题