您能解释一下python中的以下信号处理行为吗?
我有以下计划:您能解释一下python中的以下信号处理行为吗?,python,signals,freebsd,signal-handling,Python,Signals,Freebsd,Signal Handling,我有以下计划: 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 = ''
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时,抛出了“中断的系统调用”异常。知道为什么吗?它发生在Python2.6+和FreeBSD上。我怀疑这与。如果信号到达时正在执行系统调用,则系统调用是无效的。我相信这部分是为了防止升级攻击,部分是为了在调用信号处理程序时保持进程处于一致状态。它还允许您唤醒挂起系统调用的进程 要在处理信号后重新启动系统调用,请在设置信号处理程序后使用:
signal.signal(signal.SIGHUP, handler)
signal.siginterrupt(signal.SIGHUP, false)
如果信号到达时正在执行系统调用,则系统调用将被取消。我相信这部分是为了防止升级攻击,部分是为了在调用信号处理程序时保持进程处于一致状态。它还允许您唤醒挂起系统调用的进程 要在处理信号后重新启动系统调用,请在设置信号处理程序后使用:
signal.signal(signal.SIGHUP, handler)
signal.siginterrupt(signal.SIGHUP, false)