我有一个将数据写入命名管道的C程序和一个从命名管道读取数据的Python程序,如下所示:
p = open('/path/to/named/pipe', 'r')
...
data = p.read(size)
当C程序退出时,它会关闭管道。
如何从Python端检测到这一点?我已经尝试为SIGPIPE安装一个处理程序,但似乎SIGPIPE只在尝试写入已关闭的管道时发生,而不是从中读取。我还期望p.read(size)
可能会返回一个长度为零的字符串,因为另一端的EOF,但实际上它只是挂起等待数据。
我如何检测这种情况并处理它?</ p>
答案 0 :(得分:0)
您可以使用the select
module来监控管道的状态。在Linux上(select.poll()
可用,以下代码将检测是否存在已关闭的管道:
import select
# ...
poller = select.poll()
# Register the "hangup" event on p
poller.register(p, select.POLLHUP)
# Call poller.poll with 0s as timeout
for descriptor, mask in poller.poll(0):
# Can contain at most one element, but still:
if descriptor == p.fileno() and mask & select.POLLHUP:
print('The pipe is closed on the other end.')
p.close()
其他操作系统也存在类似的方法,可以检测到这种情况。
调用read
时挂起的原因是IO阻塞。您可以使用os.set_blocking
将其转换为非阻塞(并使read
返回空字符串),但这仍然不允许您检测另一端的管道何时关闭。