我是否可以使用O_DIRECT进行写入请求,以避免在电源故障期间丢失数据?

我们希望尽我们所能,以避免在断电期间丢失数据。 所以我决定使用O_DIRECT标志来打开一个文件在磁盘上写入数据。 O_DIRECT是否意味着数据完全绕过OScaching? 如果请求向应用程序返回成功,是否意味着数据必须刷新到磁盘? 如果我在一个文件系统中打开一个常规文件,FS元数据如何? 它也被立即刷新,还是被caching?

顺便说一下,O_DIRECT可以在Windows中使用? 或者在Windows中有没有相应的方法?

O_DIRECT可能会做你想做的,但是会大大减慢你的I / O。
我想只是调用fsync()或fflush(),这取决于你使用直接文件描述符操作还是FILE *应该足够了。
至于元数据问题,它依赖于底层的文件系统,甚至在硬件上,如果你想成为额外的偏执狂。 硬盘(特别是SSD)可能会报告操作已完成,但可能需要一段时间才能真正写入数据。

您可以使用O_DIRECT,但对于许多应用程序来说,调用fdatasync()更方便。 O_DIRECT强加了很多限制,因为IO完全绕过OS缓存。 它绕过读取缓存以及写入缓存。

对于文件系统元数据,您可以在写入文件之后执行fsync()文件。 fsync会刷新文件的元数据,所以你可以确保文件不会消失(或者改变它的属性等),如果之后电源立即丢失的话。

这些机制中的任何一个都取决于您的IO子系统不会向操作系统讲述将数据保存到存储器的情况,而且在很多情况下还依赖于其他硬件相关的事情(例如RAID控制器电池在电源恢复之前没有耗尽)

CreateFile可以做到这一点。

 HANDLE WINAPI CreateFile( __in LPCTSTR lpFileName, __in DWORD dwDesiredAccess, __in DWORD dwShareMode, __in_opt LPSECURITY_ATTRIBUTES lpSecurityAttributes, __in DWORD dwCreationDisposition, __in DWORD dwFlagsAndAttributes, __in_opt HANDLE hTemplateFile ); 

对于dwFlagsAndAttributes您可以指定FILE_FLAG_WRITE_THROUGHFILE_FLAG_NO_BUFFERING

如果同时指定了FILE_FLAG_WRITE_THROUGHFILE_FLAG_NO_BUFFERING ,以便系统缓存不起作用,则数据将立即刷新到磁盘而不通过Windows系统缓存 。 操作系统还要求将硬盘的本地硬件高速缓存写入持久性媒体。