【问题标题】:User buffer after doing 'write' to file opened with O_DIRECT对使用 O_DIRECT 打开的文件进行“写入”后的用户缓冲区
【发布时间】:2012-11-19 11:19:47
【问题描述】:

我使用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 可能使用该缓冲区将数据传输到设备?

【问题讨论】:

    标签: c linux file block-device


    【解决方案1】:

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

    【讨论】:

    • write() 不是 C 标准库的一部分,它是一个较低级别的 Unix 系统调用。
    • 我很困惑,一个答案说它是非法的,另一个答案说它不是。 @H2CO3 - 如果从用户缓冲区执行 DMA,“写入”会等到 DMA 完成后再返回吗??
    • @user1868481 我不认为有任何矛盾 - Barmar 的回答还说可以保证当“写入”时,您的数据已经被写入。
    • 但 Barmar 建议在 O_DIRECT 之外添加 O_SYNC 标志。有必要吗?我需要尽可能快地写这篇文章。在这个“写”之后,我用新数据填充同一个用户缓冲区,然后再次使用“写”。我只想了解当我只使用 O_DIRECT 和“写入”并激活 DMA 时会发生什么。我如何知道使用用户缓冲区是否安全,或者在“写入”返回后是否被 DMA 使用...
    • @userXXX 你知道这是安全的,因为如果不是这样,你就必须观察实现细节,而你不必这样做。
    【解决方案2】:

    O_SYNC 标志与O_DIRECT 结合使用。那么write()返回时就可以确定数据已经写入了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-08-25
      • 1970-01-01
      • 2011-09-08
      • 1970-01-01
      • 2011-07-07
      • 1970-01-01
      • 1970-01-01
      • 2012-10-03
      相关资源
      最近更新 更多