让readline在FIFO上阻塞

7 投票
1 回答
6407 浏览
提问于 2025-04-15 20:11

我创建了一个FIFO:

mkfifo tofetch

我运行这段Python代码:

fetchlistfile = file("tofetch", "r")
while 1:
    nextfetch = fetchlistfile.readline()
    print nextfetch

它在readline的时候停住了,这正是我希望的。然后我运行:

echo "test" > tofetch

结果我的程序不再停住了。它读取了这一行,然后就一直循环下去了。为什么在没有新数据的时候,它就不会再停住了呢?

我还试着查看“not fetchlistfile.closed”,我不介意在每次写入后重新打开它,但Python认为这个FIFO仍然是打开的。

1 个回答

5

根据文档,readline这个函数只有在你到达文件末尾时才会返回一个空字符串。文件关闭并不等于到达文件末尾。文件对象只有在你调用.close()的时候才会关闭。当你的代码到达文件的末尾时,readline()会持续返回空字符串。

如果你只是把文件对象当作一个迭代器使用,Python会自动一行一行地读取,直到到达文件末尾。就像这样:

fetchlistfile = file("tofetch", "r")
for nextfetch in fetchlistfile:
    print nextfetch

命令echo "test" > tofetch会打开一个命名管道,把"test"写入其中,然后关闭管道的一端。因为管道的写入端被关闭了,读取端就会看到文件末尾。

撰写回答