检测命名管道的关闭

时间:2015-04-02 03:13:16

标签: python c named-pipes

我有一个将数据写入命名管道的C程序和一个从命名管道读取数据的Python程序,如下所示:

p = open('/path/to/named/pipe', 'r')
...
data = p.read(size)

当C程序退出时,它会关闭管道。

如何从Python端检测到这一点?我已经尝试为SIGPIPE安装一个处理程序,但似乎SIGPIPE只在尝试写入已关闭的管道时发生,而不是从中读取。我还期望p.read(size)可能会返回一个长度为零的字符串,因为另一端的EOF,但实际上它只是挂起等待数据。

我如何检测这种情况并处理它?<​​/ p>

1 个答案:

答案 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返回空字符串),但这仍然不允许您检测另一端的管道何时关闭。