zoukankan      html  css  js  c++  java
  • read/write/fsync与fread/fwrite/fflush的关系和区别

    read/write/fsync: 

    1. linux底层操作;

    2. 内核调用, 涉及到进程上下文的切换,即用户态到核心态的转换,这是个比较消耗性能的操作。

    fread/fwrite/fflush: 

    1. c语言标准规定的io流操作,建立在read/write/fsync之上

    2. 在用户层, 又增加了一层缓冲机制,用于减少内核调用次数,但是增加了一次内存拷贝。


    两者之间的关系,见下图:



    补充: 

    1. 对于输入设备,调用fsync/fflush将清空相应的缓冲区,其内数据将被丢弃;

    2. 对于输出设备或磁盘文件,fflush只能保证数据到达内核缓冲区,并不能保证数据到达物理设备, 因此应该在调用fflush后,调用fsync(fileno(stream)),确保数据存入磁盘。


    ----------------------------------------------------------------------



    fwrite,fflush,你不知道的事!

    最近项目代码中遇到很多奇怪的问题,比如,在某个程序中用fwrite向配置文件中写入一些数据,而在另一段代码中需要读取该配置文件中的数据,写文件那段程序已经执行完了,但是数据并没有被写入文件,进而导致读文件的代码读不到数据,程序很难按理想的方式运行。这样下来将会导致一些列的问题,我今天就被这个问题纠结了一下午...

    那么这个问题是什么原因导致的呢,该怎么解决呢?

    导致问题的原因是 用fwrite函数写数据的时候,fwrite先将数据写到内存中的缓冲区内,
    等程序结束后才会将数据由缓冲区写入文件。所以我遇到的问题原因是整个函数还没有运行完毕,写入的数据还在缓冲区内。
    解决办法就只有靠fflush()函数了。
    #include<stdio.h>

    int fflush(FILE *stream)

    该函数的作用就是刷新缓冲区

    做法是,在写入的数据在函数结束之前就需要的时候,调用fwrite等函数后,紧接着调用fflush()函数将缓冲区刷新,这样数据就会被立刻写入文件而不用等到程序结束(因为之前的数据都在缓冲区里)。


    下面通过一个简单的例子让小伙伴们 加深理解:

    [html] view plain copy
    1. int main()  
    2. {  
    3.     FILE *fp = fopen("./file.txt","a");  
    4.     if(fp == NULL)  
    5.     {  
    6.         printf("open file err! ");  
    7.         return -1;  
    8.     }  
    9.     fwrite("hello",5,1,fp);  
    10.     //fflush(fp);  
    11.     close(fp);  
    12.       
    13.     while(1)  
    14.     {  
    15.         sleep(5);  
    16.     }  
    17.     return 0;  
    18. }  

    如上程序,当程序一直不退出的时候,虽然已经调用了fwrite但是数据却在缓冲区里,而并不在文件中,这时你可以查看改路径下的file.txt文件,你会发现文件已经建立但是大小为0,如果你在fwrite之后用fflush函数后数据就会立刻写入文件,我总结就这么多,不喜勿喷,希望对小伙伴们有帮助。

    转自:http://blog.csdn.net/zhangxiong2532/article/details/50608898
    http://blog.csdn.net/ybxuwei/article/details/22727565

  • 相关阅读:
    bootstap 折叠
    AtCoder AGC019E Shuffle and Swap (DP、FFT、多项式求逆、多项式快速幂)
    Codeforces Gym 101630J Journey from Petersburg to Moscow (最短路)
    BZOJ 4042 Luogu P4757 [CERC2014]Parades (树形DP、状压DP)
    BZOJ 2734 [HNOI2012]集合选数 (状压DP、时间复杂度分析)
    BZOJ 2759 一个动态树好题 (LCT)
    Codeforces 1205C Palindromic Paths (交互题、DP)
    getopt实现传参自动识别
    powershell笔记
    bat语法需要注意的地方
  • 原文地址:https://www.cnblogs.com/alan666/p/8311841.html
Copyright © 2011-2022 走看看