python - 非阻塞文件结束

标签 python file nonblocking eof

如何为处于非阻塞模式的文件检测到文件结尾?

最佳答案

至少在 POSIX(包括 Linux)上,显而易见的答案是不存在非阻塞常规文件。常规文件总是阻塞,并且 O_NONBLOCK 被默默地忽略。

同样,poll()/select() 等。将始终告诉您指向常规文件的 fd 已准备好进行 I/O,无论数据是在页面缓存中准备好还是仍在磁盘上(主要与读取相关)。

EDIT 而且,由于 O_NONBLOCK 对常规文件是无操作的,因此常规文件上的 read() 永远不会将 errno 设置为 EAGAIN,这与该问题的另一个答案所声称的相反。

EDIT2 引用资料:

来自 POSIX (p)select()规范:“与常规文件关联的文件描述符应始终为准备读取、准备写入和错误条件选择 true。”

来自 POSIX poll()规范:“常规文件应始终轮询 TRUE 进行读写。”

以上内容足以表明,虽然可能没有严格禁止,但非阻塞常规文件没有意义,因为除了忙于等待之外,没有办法轮询它们。

除此之外,至少还有一些间接证据

来自 POSIX open()规范:定义了引用管道、 block 特殊文件和字符特殊文件的文件描述符的行为。 "否则,未指定 O_NONBLOCK 的行为。"

一些相关链接:

http://tinyclouds.org/iocp-links.html

http://www.remlab.net/op/nonblock.shtml

http://davmac.org/davpage/linux/async-io.html

而且,即使在 stackoverflow 上:

Can regular file reading benefited from nonblocking-IO?

正如 R. 的回答所指出的那样,由于页面缓存的工作方式,常规文件的非阻塞并不是很容易定义的。例如。如果通过某种机制您发现数据已准备好在页面缓存中读取,然后在您读取它之前内核决定由于内存压力将该页面踢出缓存怎么办?对于像套接字和管道这样的东西是不同的,因为正确性要求数据不会像那样被丢弃。

另外,您将如何选择/轮询可搜索的文件描述符?您需要一些新的 API 来支持指定您感兴趣的文件中的哪个字节范围。该 API 的内核实现将绑定(bind)到 VM 系统,因为它需要阻止您感兴趣的页面从被踢出去。这意味着这些页面将计入进程锁定页面限制(请参阅 ulimit -l)以防止 DOS。而且,这些页面什么时候可以解锁?以此类推。

关于python - 非阻塞文件结束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5648969/

相关文章:

javascript - 如何将 Python 脚本整合到我的网站中?我需要一个框架吗?

python - 根据差异对列表中最近的元素进行分组

c# - 从目录中选择随机文件

perl - 如何从我的 perl 脚本非阻塞地写入 gzip 文件?

javascript - django 批量删除和添加多对多关系

python - 如何抵消 Pandas Pearson 与日期时间索引的相关性

python - 在 Python 中读取未定义数量的列并使用 matplotlib 绘制数据

java - 我的计数器没有增加并且在java中保持为1

python - 如何从 celery 任务异步调用 url

c++ - Non Blocking Keyboard on WinCE访问虚拟键盘