Unix 上 C 中的 AIO - aio_fsync 用法

AIO in C on Unix - aio_fsync usage

我无法理解这个函数 aio_fsync 的作用。我读过手册页,甚至用谷歌搜索,但找不到可以理解的定义。能简单的解释一下吗,最好能举个例子?

aio_fsync只是fsync的异步版本;完成后,所有数据都将写回物理驱动器介质。

注1:aio_fsync()只是开始请求; fsync()-like 操作在请求完成之前不会完成,类似于其他 aio_* 调用。

注2:只包含调用aio_fsync()时已经排队的aio_*操作。

如您评论所述,如果您不使用 fsync 或 aio_fsync,数据 在您的程序结束后仍会出现在文件中。 但是,如果机器突然断电,很可能就不存在了。

这是因为当您写入文件时,OS 实际上写入的是 Page Cache,它是保存在 RAM 中的磁盘扇区的副本,而不是写入磁盘本身。当然,即使在写回磁盘之前,您仍然可以看到 RAM 中的数据。当您调用 fsync() 或 aio_fsync() 时,它将确保将该文件的所有部分的 writes()、aio_writes() 等都写回物理磁盘,而不仅仅是 RAM。

如果您从不调用 fsync() 等,OS 最终会在有空闲时间时将数据写回驱动器。或者有序 OS 关机也应该这样做。

我想说你通常不必担心手动调用这些,除非你需要确保你的数据,比如日志记录,被刷新到物理磁盘并且需要更有可能在突然的系统崩溃中幸存下来。很明显,数据库引擎会为事​​务和日志执行此操作。

但是,还有其他原因可能导致数据无法保存下来,并且在出现故障时确保绝对一致性非常复杂。因此,如果您的应用程序不是绝对需要它,那么让 OS 为您管理它是完全合理的。例如,如果编译器的输出 .o 以 incomplete/corrupt 结束,因为您在编译过程中或之后不久重新启动了机器,这不会让任何人感到惊讶 - 您只需重新启动构建操作即可。