有人知道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"
答案 0 :(得分:2)
请注意,在Windows上,它只能起作用 用于插座;在其他经营 系统,它也适用于其他文件 类型(特别是在Unix上,它 适用于管道)。它不能用于 常规文件,以确定是否 文件自上次阅读以来已经增长。
这有帮助吗?
答案 1 :(得分: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 :(得分:1)
我刚遇到同样的问题:
Why does select.select() work with disk files but not epoll()?
答案是它并没有真正起作用,因为内核中任何非阻塞I / O的方法都不支持磁盘文件。 select()恰好返回“True”,然后读取()块,就像你找到的那样。是的,Unix是不一致的,也很难理解!