我正在使用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用于将数据传输到设备?
答案 0 :(得分:2)
这是合法的。这里没有发生“环回” - 如果您使用动态mallocated数组,请考虑应该做什么。你可以在write()
之后释放它吗?不是吗? - 答案是,write()
函数(和系统调用)在返回后不会修改或访问用户缓冲区 - 如果无法执行立即写入,则会生成数据副本。您不必担心实现细节(毕竟这是拥有C标准库的目的......)
答案 1 :(得分:1)
将O_SYNC
标记与O_DIRECT
结合使用。然后,您可以确保在write()
返回时已写入数据。