fsync vs write系统调用

isa*_*zan 3 filesystems berkeley-db

我想问一个基本问题,即什么时候使用像fsync这样的系统调用是有用的.我是初学者,我总是认为写入足以写入文件,而使用write的样本实际上写入文件末尾.

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

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

pax*_*blo 8

把它想象成一层缓冲.

如果你熟悉标准的C调用像fopenfprintf,你应该已经知道缓冲C运行时库本身内发生的事情.

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

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

这就是fsync需要注意的事项,确保OS缓冲区中的内容物理写入磁盘.

您通常可以在日志记录库中看到此类操作:

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

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

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

除了记录库之外,另一个用例可能对此行为很有用.让我看看我是否记得它是什么.对,就是那样.数据库!就像Berzerkely DB一样.您希望确保数据在磁盘上的位置,这是满足ACID要求的一个非常有用的功能:-)