sync、fsync、fdatasync、fflush函数区别和使用举例

Linux/unix在内核中设有缓冲区、高速缓冲或页面高速缓冲,大多数磁盘I/O(block device)都通过缓冲进行,当将数据写入文件时,内核通常先将该数据复制到其中一个缓冲区中,如果该缓冲区尚未写满,则并不将其排入输出队列,而是等待其写满 或者当内核需要重用该缓冲区以便存放其他磁盘块数据时,再将该缓冲排入输出队列,然后待其到达队首时,才进行实际的I/O操作。如上所说,假设内核一直没重用该缓存,且缓存一直没写满,是不是就存在一个大大大的BUG呢?显然这种情况是不允许的,为了解决这个问题,系统有一个叫update守护进程定期会执行sync.常规PC机方面,这种方案即解决了频繁写入磁盘的问题,又保障了写入磁盘数据的完整性!
sync:将所有修改过的快缓存区排入写队列,然后返回,并不等待实际写磁盘操作结束;
fsync函数:只对有文件描述符制定的单一文件起作用,并且等待些磁盘操作结束,然后返回;
fdatasync:类似fsync,但它只影响文件的数据部分。fsync还会同步更新文件的属性;
fflush:标准I/O函数(如:fread,fwrite)会在内存建立缓冲,该函数刷新内存缓冲,将内容写入内核缓冲,要想将其写入磁盘,还需要调用fsync。(先调用fflush后调用fsync,否则不起作用)。

示例:     

       fp = fopen(filename, "wb+");
       gettimeofday(&start, NULL); //获取时间  struct timeval start
         if (fwrite(w_buf, g_block_size, 1, fp) <= 0)  //写入
            break;

        fflush(fp); //可能有fwrite没写完的部分, flush 内存缓存 到 fp 缓存
        fdatasync(fileno(fp));   //写入磁盘 ,也可以用fsync
        gettimeofday(&end, NULL);
        write_timeuse += 1000000 * (end.tv_sec - start.tv_sec) + end.tv_usec - start.tv_usec;

 

你可能感兴趣的:(sync、fsync、fdatasync、fflush函数区别和使用举例)