c - 对使用 O_DIRECT 打开的文件执行 'write' 后的用户缓冲区

标签 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 可能用来将数据传输到设备的用户缓冲区是否有效?

最佳答案

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

关于c - 对使用 O_DIRECT 打开的文件执行 'write' 后的用户缓冲区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13658741/

相关文章:

linux - Shellscript逐行复制文件到新文件并每50行添加一行

linux - setenv bash 命令在 shell 中不起作用

javascript - 在 Node 中读取 Javascript 文件

c - 需要一些关于在 C 中类型转换的澄清

c - 如何在 sublime text 3 mac osX 中构建和运行 C 程序

c - 使用 malloc 的指针数组 : The code runs into a segmentation fault. 救命!谢谢

ruby - 使用 YAML 有什么好处?

有人可以帮我把这个c程序翻译成MIPS汇编吗?

linux - 支持Linux机器的打包工具

c# - 文件扩展名中可以存在空格吗?