【问题标题】:Can you explain the following signal handling behavior in python?你能解释一下python中的以下信号处理行为吗?
【发布时间】:2010-11-29 07:54:29
【问题描述】:

我有以下程序:

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 有关。

【问题讨论】:

    标签: python signals freebsd signal-handling


    【解决方案1】:

    如果信号到达时正在执行系统调用,则系统调用为interrupted。我相信这部分是为了防止升级攻击,部分是为了在调用信号处理程序时保持进程处于一致状态。它还可以让您唤醒挂在系统调用上的进程。

    要在处理信号后重新启动系统调用,请在设置信号处理程序后使用signal.siginterrupt

    signal.signal(signal.SIGHUP, handler)
    signal.siginterrupt(signal.SIGHUP, false)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-09-15
      • 1970-01-01
      • 2015-01-06
      • 1970-01-01
      • 2011-08-22
      • 1970-01-01
      • 2017-01-15
      • 1970-01-01
      相关资源
      最近更新 更多