我想问一个基本问题,什么时候使用像 fsync 这样的系统调用有用。我是初学者,我一直认为 write 足以写入文件,而使用 write 的示例实际上最后写入文件。
那么像 fsync 这样的系统调用的目的是什么?
只是为了提供一些背景知识,我正在使用 Berkeley DB 库版本 5.1.19,并且有很多关于 fsync() 与编写成本的讨论。这就是我想知道的原因。
我想问一个基本问题,什么时候使用像 fsync 这样的系统调用有用。我是初学者,我一直认为 write 足以写入文件,而使用 write 的示例实际上最后写入文件。
那么像 fsync 这样的系统调用的目的是什么?
只是为了提供一些背景知识,我正在使用 Berkeley DB 库版本 5.1.19,并且有很多关于 fsync() 与编写成本的讨论。这就是我想知道的原因。
将其视为一层缓冲。
如果您熟悉诸如fopen
and之类的标准 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 要求 :-)