sync fsync fdatasync fflush的区别和应用

首先为何会要使用sync fsync fdatasync这些函数?

因为硬盘读写速度远远小于内存的读写速度,如果频繁的读写硬盘会浪费很多时间,所以在写文件时会先将需要写入的内容写到内存,并没有同步到磁盘,会等到一定时机(通常称为updata的系统守护进程周期调用sync函数)或调用了某些函数(sync、fsync…)再同步到磁盘中。但如果时机没有到来或者没有调用某些函数来将数据及时同步到磁盘中,此时有特殊情况发生,例如系统掉电或另一进程读写未及时同步到磁盘的数据就会出现期望外的事情发生。
**

sync fsync fdatasync fflush的区别

**
sync
void sync(void);
sync函数只是将所有修改过的块缓冲区排入写队列,然后就返回,它并不等待实际写磁盘操作结束。

fsync
int fsync(int fd);
fsync函数只对由文件描述符filedes指定的单一文件起作用,并且等待写磁盘操作结束,然后返回。

fdatasync
int fdatasync(int fd);
fdatasync函数类似于fsync,但它只影响文件的数据部分。而除数据外,fsync还会同步更新文件的属性。

fflush
int fflush(FILE *stream);
fflush函数是标准IO函数(如fread,fwrite等)会在内存中建立缓冲,该函数刷新内存缓冲,将内容写入内核缓冲,要想将其真正写入磁盘,还需要调用fsync。**注意这里的缓冲和上述三个函数的缓冲不同!!!**上述三个函数(sync fsync fdatasync)的缓冲是内核I/O缓冲区。调用fflush函数只是将流缓存刷新到内核的I/O缓存!所以调用fflush后还应该调用刷新I/O缓存的函数,才能真正的将数据同步到磁盘。

总结
1.fflush区别于其他三个是缓存区不同,刷新后将数据刷新到I/O缓存,并不能将数据同步到磁盘。
2.fdatasync的区别fsync。fdatasync类似fsync,但它只影响文件的数据部分。fsync还会同步更新文件的属性;fsync除了同步文件的数据部分,还会同步文件的描述信息(metadata,包括size、访问时间等等),因为文件的数据和metadata通常存在硬盘的不同地方,因此fsync至少需要两次IO写操作,比起fdatasync会多一次IO操作。

另外需要注意,使用完标准I/O后,直接调用sync并起不到将流缓冲中的数据同步到磁盘的作用!!!(例如调用完fwrite,如果没有调用fclose,直接调用sync,数据是不会同步到磁盘的)
测试代码

int main ()
{
      FILE *fd = NULL;
      fd = fopen("testaa.txt","a+");
      if(fd == NULL)
          printf("fopen fail!!\n");
      fwrite("ABCDEFG",sizeof("ABCDEFG"),1,fd);
      sync();
      printf("sync 1\n");
      sync();
      printf("sync 2\n");
      sleep(10);
      fflush(fd);
      sync();
      printf("fflush\n");
      sleep(10);
      fclose(fd);
      return 0;
  }

输出结果:
在这里插入图片描述

参考资料:http://blog.sina.cn/dpool/blog/s/blog_d12930f40102v32o.html?vt=4
https://www.cnblogs.com/liudehao/articles/6647674.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值