python - siginterrupt() 只适用于第一个信号? (Python)

标签 python linux unix signals

出于某种原因,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()。

参见 http://lkml.org/lkml/2005/7/23/119

关于python - siginterrupt() 只适用于第一个信号? (Python),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1664195/

相关文章:

使用大型查找表的 Python 类

linux - 数组中的 Bash 值

python - 在终端中运行 python 脚本

regex - 考虑到特殊的正则表达式,如何正确使用 sed 替换命令的反向引用

java - 这个值 "20150716203621.000Z"的时间格式的技术术语是什么?

linux - 在 Unix/Linux 中查找固定文件大小 (>0) 的文件

python - matplotlib 3D 带状图

Python - 在调用类方法时从父类访问子类的变量

python - 类型错误 : 'Response' object has no attribute '__getitem__'

c - mkstemp 和硬盘压力