6

我想问一个基本问题,什么时候使用像 fsync 这样的系统调用有用。我是初学者,我一直认为 write 足以写入文件,而使用 write 的示例实际上最后写入文件。

那么像 fsync 这样的系统调用的目的是什么?

只是为了提供一些背景知识,我正在使用 Berkeley DB 库版本 5.1.19,并且有很多关于 fsync() 与编写成本的讨论。这就是我想知道的原因。

4

1 回答 1

14

将其视为一层缓冲。

如果您熟悉诸如fopenand之类的标准 C 调用fprintf,那么您应该已经知道缓冲发生在 C 运行时库本身中。

刷新这些缓冲区的方法是fflush确保将信息从 C 运行时库传递到操作系统(或周围环境)。

但是,仅仅因为操作系统有它,并不意味着它在磁盘上。它也可以在操作系统中缓冲。

这就是fsync需要注意的事情,确保操作系统缓冲区中的内容被物理写入磁盘。

您通常会在日志库中看到这种操作:

fprintf (myFileHandle, "something\n");  // output it
fflush (myFileHandle);                  // flush to OS
fsync (fileno (myFileHandle));          // flush to disk

fileno是一个函数,它为您提供给定文件句柄的底层int文件描述符,并在描述符上执行最终级别的刷新。FILE*fsync

现在这一个相对昂贵的操作,因为磁盘写入通常比内存传输慢得多。

除了日志库之外,另一个用例可能对这种行为有用。让我看看我是否记得那是什么。对,就是那样。数据库!就像 Berzerkely DB 一样。如果您想确保数据在磁盘上,这是一个非常有用的功能,可以满足 ACID 要求 :-)

于 2012-04-29T09:39:09.120 回答