你能解释一下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 个回答
1
当一个系统调用正在执行时,如果有信号到达,这个系统调用会被中断。我认为这样做部分是为了防止攻击升级,部分是为了在信号处理程序被调用时保持进程的一致状态。这样也可以让你唤醒一个在系统调用中卡住的进程。
如果你想在处理完信号后重新启动系统调用,可以在设置信号处理程序后使用signal.siginterrupt
:
signal.signal(signal.SIGHUP, handler)
signal.siginterrupt(signal.SIGHUP, false)