A.3. Fsync
Fsync
被视为大量消耗 I/O 的操作,但这并不完全正确。例如:参见 Theodore Ts'o's 的文章《不要害怕 fsync!》 [5] 以及附带的讨论。
Firefox 原来在用户每次点击一个链接时都调用 sqlite 程序库进入新的页面。Sqlite 调用
fsync
,且由于文件系统设置(主要使用数据排序模式的 ext3),什么都不发生时会有一个长时间延迟。如果另一个进程同时正在复制一个大文件,这就需要很长的时间(最长可达 30 秒)。
但在另一个示例中根本不使用
fsync
,则在切换到 ext4 文件系统时出了问题。Ext3 是被设定为数据排序模式,它会每几秒钟排空一次内存并将其保存到磁盘中。但 ext4 使用的是笔记本电脑模式,保存内存的时间间隔较长,且可能在系统意外关闭时丢失数据。现在 ext4 有一个补丁,但我们必须仍在设计应用程序时小心谨慎,正确使用 fsync
。
下面读取和写入配置文件的简单示例演示了如何备份文件或者数据是怎么丢失的:
/* open and read configuration file e.g. ~/.kde/myconfig */ fd = open("./kde/myconfig", O_WRONLY|O_TRUNC|O_CREAT); read(myconfig); ... write(fd, bufferOfNewData, sizeof(bufferOfNewData)); close(fd);
更好的方法可能是:
open("/.kde/myconfig", O_WRONLY|O_TRUNC|O_CREAT); read(myconfig); ... fd = open("/.kde/myconfig.suffix", O_WRONLY|O_TRUNC|O_CREAT); write(fd, bufferOfNewData, sizeof(bufferOfNewData)); fsync; /* paranoia - optional */ ... close(fd); rename("/.kde/myconfig", "/.kde/myconfig~"); /* paranoia - optional */ rename("/.kde/myconfig.suffix", "/.kde/myconfig");