使用select.select()处理常规文件

2 投票
2 回答
5271 浏览
提问于 2025-04-16 10:57

有没有人知道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系统上,它可以用于管道)。不过,它不能用来检查普通文件自上次读取以来是否有增加。

这样解释有帮助吗?

撰写回答