使用select.select()处理常规文件
有没有人知道select.select()这个函数是只适用于套接字/管道,还是也可以用于普通文件呢?
我在Solaris、Linux和Mac OS X上试过,发现它在调用select.select()时并不会阻塞。
这让我很困惑,尝试了很多方法都没有成功。
import os
import select
fds = [ os.open("read.txt", os.O_RDONLY) ]
while True:
reads, _, _ = select.select(fds, [], [], 2.0)
if 0 < len(reads):
print "-> ",os.read(reads[0], 10)
else:
print "timeout"
2 个回答
1
select
这个命令也可以用在文件上,不过我觉得文件的文件描述符(FD)总是处于准备好的状态。
你还需要检查一下是否已经到达文件的末尾。下面是一个对我有效的例子:
import os
import select
fds = [ os.open("data", os.O_RDONLY) ]
while True:
reads, _, _ = select.select(fds, [], [], 2.0)
if 0 < len(reads):
d = os.read(reads[0], 10)
if d:
print "-> ", d
else:
break
else:
print "timeout"
2
来自文档:
请注意,在Windows系统上,这个功能只适用于网络连接(也就是“套接字”);而在其他操作系统上,它还可以用于其他类型的文件(特别是在Unix系统上,它可以用于管道)。不过,它不能用来检查普通文件自上次读取以来是否有增加。
这样解释有帮助吗?