假设我有一个执行以下操作的简单程序:
fdWrite = open("file", O_WRONLY);
fdRead = open("file", O_RDONLY | O_DIRECT);
writeBuffer = <some data>;
write(fdWrite, writeBuffer);
readBuffer = read(fdRead, sizeof(writeBuffer));
我会得到保证readBuffer == writeBuffer
吗?(显然,鉴于此文件的其他 fd 目前没有打开)
在 Linux 上进行的一些简单测试似乎表明,是的,来自 write 调用的脏页将在通过读取之前刷新到磁盘O_DIRECT
,但我似乎在任何地方都找不到关于这种情况的任何提及。据我所知,它的工作可能完全是巧合,而且我不知道在其他类似 POSIX 的平台上会发生什么。至少我想得到一些“确凿的证据”。
你为什么做这个?
它是在应用程序分发被缓存的大文件的上下文中。收到文件的新部分后,我想验证新部分。我看到使用的两个优点O_DIRECT
:首先,我不仅检查数据是否已正确接收,而且可以从存储介质中正确检索。如果没有O_DIRECT
,我几乎可以保证我只是从页面缓存中获取数据。为了在O_DIRECT
没有. (因为我曾经了解到在脏页上调用with本质上是一个无用的方法)。
但是,如果有人对此有更优雅的建议,我会全力以赴。:-)sync_file_range
madvise
madvise
MADV_DONTNEED