【发布时间】:2015-04-02 03:13:15
【问题描述】:
我有一个将数据写入命名管道的 C 程序和一个从命名管道读取数据的 Python 程序,如下所示:
p = open('/path/to/named/pipe', 'r')
...
data = p.read(size)
当 C 程序退出时,它会关闭管道。
如何从 Python 端检测到这一点?我尝试为 SIGPIPE 安装处理程序,但似乎 SIGPIPE 仅在尝试写入封闭管道时发生,而不是从中读取。我还预计 p.read(size) 可能会因为另一端的 EOF 而返回长度为零的字符串,但实际上它只是挂起等待数据。
我该如何检测并处理这种情况?
【问题讨论】:
-
如果 Python 处于闲置状态,这几乎肯定意味着某个进程(可能它本身)仍然有管道打开以供写入。如果所有的作者都关闭了管道,那么所有的读者(通常,'all' 只是一个读者)将在他们下一次尝试阅读时获得 EOF。请注意,如果 Python 打开管道进行读取和写入,它是一个写入器,永远不会得到 EOF。
-
您可以为该文件描述符放置
nonblock。 -
我认为这里的问题是使用
open(...,'r')没有做正确的事情;必须使用os.open(..., os.O_RDONLY)。
标签: python c named-pipes