sync fsync fdatasync fflush的区别和应用

sync fsync fdatasync fflush的区别和应用

    • 首先为何会要使用sync fsync fdatasync这些函数?
    • 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;
  }

输出结果:
sync fsync fdatasync fflush的区别和应用_第1张图片

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

你可能感兴趣的:(LINUX)