出于某种原因,siginterrupt() 似乎只为接收到的第一个信号设置行为。
在这个示例程序中,第一个 SIGQUIT 似乎什么都不做,但第二个 sigquit 打印“SIGQUIT Handler”并且 s.accept() 抛出一个 Interrupted 系统调用异常。
from signal import *
from socket import *
import sys
def sigquitHandler(signum, frame):
print("SIGQUIT Handler")
s = socket()
s.bind(("0.0.0.0", int(sys.argv[1])))
s.listen(5)
signal(SIGQUIT, sigquitHandler)
siginterrupt(SIGQUIT, False)
client, addr = s.accept() # Or any syscall that blocks
client.close()
s.close()
我在这里误解了什么?
编辑:还有一些我想不通的事情,在这个程序中,SIGQUIT 中断了 select()。这应该发生吗?
from signal import *
import select
import sys
def sigquitHandler(signum, frame):
print("SIGQUIT Handler")
signal(SIGQUIT, sigquitHandler)
siginterrupt(SIGQUIT, False)
select.select([sys.stdin], [], [])
最佳答案
这是一个bug python 。 “当接收到信号时,带有 flag=False 的 siginterrupt 被重置”,这在以后的 python2.6 版本中已得到修复。 (2.6.6+, 2.7+)
对于第二个,信号中断不影响 select()。
关于python - siginterrupt() 只适用于第一个信号? (Python),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1664195/