【发布时间】:2018-08-08 06:46:04
【问题描述】:
所以,这是一个奇怪的案例,我有时会看到但无法找出原因。
我们有一个从常规文件中读取的 C 程序。还有其他进程写入同一个文件。该应用程序基于这样一个事实,即在 Linux 中写入是原子的,写入大小可达 4096 字节。
文件未使用非阻塞标志打开,所以我的假设是读取会阻塞。
但有时在启动过程中,我们会在errno 中看到“资源暂时不可用”错误。以及 read != -1 返回的大小,但部分读取的大小。
错误消息类似于:
2018-08-07T06:40:52.991141Z,无效的消息大小,log_s.bin,fd 670,资源暂时不可用,读取大小 285,预期大小 525我的问题是:
为什么我们在阻止文件读取时收到
EAGAIN?为什么返回值不是-1?
这只发生在它启动的初始时间。此后它工作正常。有哪些极端情况会让我们陷入这种情况?
【问题讨论】:
-
当它启动时,它没有任何数据要读取,所以 read 正在等待数据读取,read 被阻塞,这就是你得到 EAGAIN 的原因。
-
如果说写是原子的,那为什么还要等待呢?上述错误消息的所有 525 个字节应该都可用,对吧?
-
你读取的文件存放在哪种文件系统中?