我想问一个基本问题,什么时候使用像fsync这样的系统调用是有用的。我是初学者,我一直认为write就足以写入文件,而使用write的示例实际上是在最后写入文件。
那么像fsync这样的系统调用的目的是什么呢?
只是为了提供一些背景知识,我使用的是Berkeley DB库版本5.1.19,有很多关于fsync()的成本与仅仅编写代码的讨论。这就是我想知道的原因。
发布于 2012-04-29 17:39:09
可以把它想象成一个缓冲层。
如果您熟悉像fopen和fprintf这样的标准C调用,您应该已经知道在C运行时库中发生的缓冲。
刷新这些缓冲区的方法是使用fflush,它确保信息从C运行时库传递到操作系统(或周围环境)。
然而,仅仅因为操作系统拥有它,并不意味着它在磁盘上。它也可以在操作系统中得到缓冲。
这就是fsync所负责的,确保OS缓冲区中的内容以物理方式写入磁盘。
您通常会在日志库中看到这类操作:
fprintf (myFileHandle, "something\n"); // output it
fflush (myFileHandle); // flush to OS
fsync (fileno (myFileHandle)); // flush to diskfileno是一个函数,它为给定的int文件句柄提供底层FILE*文件描述符,描述符上的fsync执行最后一级刷新。
现在,这是一个相对昂贵的操作,因为磁盘写入通常比内存中传输慢得多。
和日志库一样,另一个用例可能对此行为有用。让我看看我能不能记住那是什么。是的,就是这样。数据库!就像Berzerkely DB一样。您希望确保数据位于磁盘上的位置,这是一个非常有用的特性,用于满足ACID需求:-)
https://stackoverflow.com/questions/10371017
复制相似问题