我正在使用O_DIRECT
标志,从用户缓冲区直接写入磁盘。但就我所知,Linux不保证此调用后数据已被写入。它只是使用DMA或其他方法,将数据直接从用户缓冲区写入物理设备...因此,我不明白在'写入'函数调用后是否可以向用户缓冲区写入。
我相信示例代码将有助于理解我的问题:
char *user_buff = malloc(...); /* assume it is aligned as needed */
fd = open(..., O_DIRECT);
write(fd, ...)
memset(user_buff, 0, ...)
最后一行(memset)是否合法?向用户缓冲区写入数据有效吗?该缓冲区可能被DMA用于将数据传输到设备。
write()
不是 C 标准库的一部分,它是一个更低级别的 Unix 系统调用。 - BarmarO_DIRECT
是否意味着由HDD控制器提供的DMA
。我认为它只是绕过了库内部缓冲区的使用。在硬件级别或使用分布式文件系统时仍可能发生缓存。为确保后者也已被刷新,应使用O_SYNC
,以便数据被保证已经被物理保存。 - alk