按照典型的Unix风格,read(2)
返回0个字节来表示文件结束,这可能意味着:
- 文件中没有更多的字节
- 套接字的另一端关闭了连接
- 写入者已经关闭了管道
在您的情况下,fifo.read()
返回一个空字符串,因为写入者已经关闭了它的文件描述符。
您应该检测到这种情况并跳出循环:
reader.py:
import os
import errno
FIFO = 'mypipe'
try:
os.mkfifo(FIFO)
except OSError as oe:
if oe.errno != errno.EEXIST:
raise
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 opened
Read: "hello"
Writer closed
$
更新1 - 持续重新打开
您表示希望保持对管道的写入监听,即使写入端已关闭。
为了有效地实现这一点,您可以(并且应该)利用以下事实:
通常情况下,打开FIFO会阻塞,直到另一端也被打开。
在此,我在open
和read
循环周围添加了另一个循环。这样,一旦管道关闭,代码将尝试重新打开它,这将阻塞直到另一个写入器打开管道:
import os
import errno
FIFO = 'mypipe'
try:
os.mkfifo(FIFO)
except OSError as oe:
if oe.errno != errno.EEXIST:
raise
while 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 opened
Read: "hello"
Writer closed
Opening FIFO...
<blocks>
终端 2:
$ echo -n 'hello' > mypipe
终端1:
FIFO opened
Read: "hello"
Writer closed
Opening FIFO...
<blocks>
您可以通过阅读管道的man
页面了解更多信息:
print(line)
输出什么?另外,你是如何写入它的? - Padraic Cunningham