2010-11-29 2 views
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이 보내지고 "중단 된 시스템 호출"예외가 발생하는 경우입니다. 왜 그런가? 그것은 파이썬 2.6+와 FreeBSD에서 일어나고 있습니다. 나는 그것이 http://bugs.python.org/issue1975와 관련이 있다고 생각합니다.

답변

1

신호가 도착할 때 시스템 호출이 실행 중이면 시스템 호출은 interrupted입니다. 나는 부분적으로 에스컬레이션 공격을 막는 것과 시그널 핸들러가 호출 될 때 프로세스를 일관된 상태로 유지하는 것이라고 생각한다. 또한 시스템 호출에 매달린 프로세스를 깨울 수 있습니다.

signal.signal(signal.SIGHUP, handler) 
signal.siginterrupt(signal.SIGHUP, false) 
: 대신에 시스템을 다시 시작하려면

는 신호가 처리되는 후 신호 처리기를 설정 한 후, signal.siginterrupt을 사용하여 호출