我有一个程序,该程序使用O_Direct从文件读取。该文件是由另一个过程不断编写的。读取循环正常工作,直到达到写入的点为止。此时,read()使用Einval(无效的参数)失败。如果我不使用O_Direct,则不会发生此问题并读取返回有效的值。 我已经证实了块大小为4096。 我的代码是我的代码:

问题描述 投票:0回答:0
524288 524288 524288 524288 524288 172020 0 0 Error reading file: Invalid argument fd: 3 buffer: 0x7f4140e88000 BUFFER_SIZE: 524288

尝试读取同时编写的数据时,这意味着读()失败。

我检查了什么:

使用aligned_alloc(4096,buffer_size)正确对齐缓冲区。 Buffer_Size是4096的倍数,可确保它符合O_Direct对齐要求。 FD在发生错误之前是有效的。

文件存在并通过另一个过程不断更新。

Filesystem:Ext4(本地SSD) CPU型号:Intel(R)Core(TM)I9-14900K Linux:5.15.77-1-LTS

问题

为什么读取()到达写作点时返回einval?

有一种方法可以等待更多数据,而不是在读取()到达不成文的部分时失败?

对O_Direct如何与并发写作相互作用的任何洞察力都将不胜感激!

在艾伦的评论中建议:

阅读必须始终从偏移量开始,这是块大小的倍数,在读取没有返回块大小的读取倍数之后,您需要寻找回到块

的开始

c++ linux filesystems system-calls
最新问题
© www.soinside.com 2019 - 2025. All rights reserved.