用O_DIRECT打开文件“写入”后的用户缓冲区

时间:2012-12-01 10:59:09

标签: c linux file block-device

我正在使用O_DIRECT标志直接从用户缓冲区写入磁盘。 但据我了解,Linux并不保证在此调用之后,数据被写入。 它只是使用DMA或其他任何东西直接从用户缓冲区写入物理设备...... 因此,我不明白在调用'write'函数后是否可以写入用户缓冲区。

我确信示例代码有助于理解我的问题:

char *user_buff = malloc(...); /* assume it is aligned as needed */
fd = open(..., O_DIRECT);
write(fd, ...)
memset(user_buff, 0, ...)

最后一行(memset)合法吗?写入有效的用户缓冲区是否可以由DMA用于将数据传输到设备?

2 个答案:

答案 0 :(得分:2)

这是合法的。这里没有发生“环回” - 如果您使用动态mallocated数组,请考虑应该做什么。你可以在write()之后释放它吗?不是吗? - 答案是,write()函数(和系统调用)在返回后不会修改或访问用户缓冲区 - 如果无法执行立即写入,则会生成数据副本。您不必担心实现细节(毕竟这是拥有C标准库的目的......)

答案 1 :(得分:1)

O_SYNC标记与O_DIRECT结合使用。然后,您可以确保在write()返回时已写入数据。