write() 之后还要做些什么

来源:互联网 发布:大智慧365数据同步 编辑:程序博客网 时间:2024/04/30 07:29

一、要做什么

一般来说,调用write( ) 函数之后,还需要调用 fsync( ),把修改同步到磁盘上

二、原理

虽说,write( )是不带缓存的函数,但是 write( )不带缓存是指不在C库中缓存,只要应用层调用 write( ),就直接发出 write( )系统调用,而内核中的 write( ) 块设备都是有缓存的,所以就需要 fsync 将磁盘高速缓冲中的数据立刻写入磁盘中去!!

传统的UNIX实现在内核中设有缓冲存储器,大多数磁盘 I/O都通过缓存进行。当将数据写到文件上时,通常该数据先由内核复制到缓存中,如果该缓存尚未写满,则并不将其排入输出队列,而是等待其写满或者当内核需要重用该缓存以便存放其他磁盘块数据时,再将该缓存排入输出队列,然后待其到达队首时,才进行实际的 I/O 操作。这种输出方式被称之为延迟写(delayed write)(Bach 〔1 9 8 6〕第3章详细讨论了延迟写)。

延迟写减少了磁盘读写次数,但是却降低了文件内容的更新速度,使得欲写到文件中的数据在一段时间内并没有写到磁盘上。当系统发生故障时,这种延迟可能造成文件更新内容的丢失。为了保证磁盘上实际文件系统与缓存中内容的一致性,UNIX系统提供了sync 和 fsync两个系统调用函数。

#include <unistd.h>void sync(void);int fsync(int filedes) ;
返回:若成功则为 0,若出错则为 -1

sync( ) 只是将所有修改过的块的缓存排入写队列,然后就返回,它并不等待实际 I/O操作结束。

系统精灵进程(通常称为update )一般每隔30秒调用一次sync函数。这就保证了定期刷新内核的块缓存。

函数 fsync( ) 只引用单个文件 (由文件描述符filedes指定),它等待 I/O 结束,然后返回。

fsync( ) 可用于数据库这样的应用程序,它确保修改过的块立即写到磁盘上。