让readline在FIFO上阻塞
我创建了一个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"写入其中,然后关闭管道的一端。因为管道的写入端被关闭了,读取端就会看到文件末尾。