linux系统函数fwrite、fflush使用及注意事项

  • 问题的产生
  • 解决办法


问题的产生

  • 最近在重新嵌入式远程升级updateApp时,发现文件已经接收完毕,也调用了fwrite函数接口,进入到ARM linux系统中却发现写入的文件大小为0????
  • 一猜想肯定是fwrite函数出了问题,于是乎对该接口进行了一些研究果然发现存在缓冲区的,fwrite向文件中写入一些数据,并没有及时的同步到磁盘上,而是在内核缓冲区中暂留,等到程序结束的时候会被刷新都磁盘文件。

解决办法

  • 靠fflush()函数
#include<stdio.h>
int fflush(FILE *stream)
/*该函数的作用就是刷新缓冲区*/
  • 做法是,在写入的数据在函数结束之前就需要的时候,调用fwrite等函数后,紧接着调用fflush()函数将缓冲区刷新,这样数据就会被立刻写入文件而不用等到程序结束(因为之前的数据都在缓冲区里)。

可以用下面的实例进行测试:

int main()
{
    FILE *fp = fopen("./a.txt", "a");
    if(fp == NULL)
    {
        printf("open file err!\n");
        return -1;
    }
    fwrite("aaaaa", 5, 1, fp);
    // 刷新到磁盘
    //fflush(fp);
    
    close(fp);
    while(1)
    {
        sleep(5);
    }
    return 0;
}

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