以典型的UNIX方式,
read(2)返回0字节以指示文件结束,这可能意味着:
- 文件中没有更多字节
- 套接字的另一端已关闭连接
- 作者已关闭管道
在您的情况下,
fifo.read()正在返回一个空字符串,因为编写器已关闭其文件描述符。
您应该检测到这种情况并打破循环:
reader.py :
import osimport errnoFIFO = 'mypipe'try: os.mkfifo(FIFO)except OSError as oe: if oe.errno != errno.EEXIST: raiseprint("Opening FIFO...")with open(FIFO) as fifo: print("FIFO opened") while True: data = fifo.read() if len(data) == 0: print("Writer closed") break print('Read: "{0}"'.format(data))会话示例
1号航站楼 :
$ python reader.py Opening FIFO...<blocks>
2号航站楼 :
$ echo -n 'hello' > mypipe
1号航站楼 :
FIFO openedRead: "hello"Writer closed$
更新1-不断重新打开
您指出您想继续监听管道上的写入,即使在关闭写入器之后也是如此。
为了有效地做到这一点,您可以(并且应该)利用以下事实:
通常,打开FIFO块,直到另一端也打开。
在这里,我周围添加另一个循环
open和
read循环。这样,一旦管道关闭,代码将尝试重新打开它,直到其他编写者打开管道为止,该代码将阻塞:
import osimport errnoFIFO = 'mypipe'try: os.mkfifo(FIFO)except OSError as oe: if oe.errno != errno.EEXIST: raisewhile True: print("Opening FIFO...") with open(FIFO) as fifo: print("FIFO opened") while True: data = fifo.read() if len(data) == 0: print("Writer closed") break print('Read: "{0}"'.format(data))1号航站楼 :
$ python reader.py Opening FIFO...<blocks>
2号航站楼 :
$ echo -n 'hello' > mypipe
1号航站楼 :
FIFO openedRead: "hello"Writer closedOpening FIFO...<blocks>
2号航站楼 :
$ echo -n 'hello' > mypipe
1号航站楼 :
FIFO openedRead: "hello"Writer closedOpening FIFO...<blocks>
… 等等。
您可以通过阅读
man有关管道的页面来了解更多信息:
- PIPE(7)-Linux程序员手册
- FIFO(7)-Linux程序员手册



