gpt4 book ai didi

python - 系统调用和信号处理程序

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:36:43 27 4
gpt4 key购买 nike

我有一个程序使用 select 阻止读取,但我希望它通过发送 SIGINT 信号优雅地返回。并使用处理程序处理该信号。不幸的是, block 程序不会从 select 系统调用返回,而是接收 SIGINT 和中断。谁能帮我弄清楚问题出在哪里?非常感谢。

import select
import socket
import signal

class Test(object):
def __init__(self):
self._read, self._write = socket.socketpair()

def wait(self):
readable = [self._read.fileno()]
return select.select(readable, [], readable)

def wakeup(self):
self._write.send('1')


t = Test()

def handler(signum, frame):
t.wakeup()


signal.signal(signal.SIGINT, handler)

if __name__ == '__main__':
print t.wait()
print 'over.'

最佳答案

您误解了程序的行为:它确实从 select 系统调用返回,但带有您必须处理的错误“系统调用中断”。

import errno
import select
import socket
import signal

class Test(object):
def __init__(self):
self._read, self._write = socket.socketpair()

def wait(self):
readable = [self._read.fileno()]
try:
return select.select(readable, [], readable)
except select.error as e:
if e.args[0] == errno.EINTR:
return
else:
pass

def wakeup(self):
self._write.send('1')


t = Test()

def handler(signum, frame):
t.wakeup()


signal.signal(signal.SIGINT, handler)

if __name__ == '__main__':
print t.wait()
print 'over.'

关于python - 系统调用和信号处理程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16806187/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com