gpt4 book ai didi

python - 选择不适用于 python 中的管道?

转载 作者:太空狗 更新时间:2023-10-29 11:17:45 25 4
gpt4 key购买 nike

使用check_parent_select时,reader端关闭后,exception list没有填充。

但是使用check_parent_poll,reader端关闭后,可以检测到管道断开。

有人知道根本原因吗?

#!/usr/bin/python2.7
import select
import sys
import os

log=open("./test.log","w")
(reader, writer) = os.pipe()
def check_parent_select(fh):
(rlist, wlist, xlist) = select.select([], [], [fh], 1)
if fh in xlist:
print "parent exit"
else:
print "parent OK"

def check_parent_poll(fh):
poller = select.poll()
EVENTS = select.POLLERR
poller.register(fh)
events = poller.poll()
for fd, flag in events:
if flag & select.POLLERR:
print "parent exit"
else:
print "parent OK"

open_file = os.fdopen(writer, "w")
check_parent_select(open_file)
os.close(reader)
check_parent_select(open_file)

用strace跟踪select函数,select检测不到管道关闭。

pipe([4, 5]) = 0

select(6, [], [], [5], {1, 0}) = 0 (Timeout)

write(1, "parent OK\n", 10parent OK

close(4) = 0

select(6, [], [], [5], {1, 0}) = 0 (Timeout)

最佳答案

有点隐蔽,但如果你关注the documentation , 它变得更加清晰:select() 检查未决错误条件,即使文件描述符不可用的错误条件,但仅在错误发生后。

关闭读取端后,您还没有对管道进行任何操作,这会导致错误情况。 writer 仍然有有效的操作:例如,您可以关闭 fd。因此管道还没有处于错误状态。

关闭写入端时更容易发现问题:即使在关闭之后,管道缓冲区中可能还有可读数据,但尚未被消耗。在这种情况下,您希望 read()EOF 时返回 0,而不是在错误时返回 -1。另一端的行为类似,即使您确实无法写入读取端已关闭的管道。

行为与 socket.socketpair()(或实际套接字)相同:只要还没有做任何无效的事情,就没有错误条件。

log=open("./test.log","w")    
(reader, writer) = socket.socketpair()
def check_parent_select(fh):
(rlist, wlist, xlist) = select.select([], [], [fh], 1)
if fh in xlist:
print "parent exit"
else:
print "parent OK"

def check_parent_poll(fh):
poller = select.poll()
EVENTS = select.POLLERR
poller.register(fh)
events = poller.poll()
for fd, flag in events:
if flag & select.POLLERR:
print "parent exit"
else:
print "parent OK"

check_parent_select(writer)
reader.close()
check_parent_select(writer)

关于python - 选择不适用于 python 中的管道?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38759184/

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