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!\n");
  7. return -1;
  8. }
  9. fwrite("hello",5,1,fp);
  10. //fflush(fp);
  11. close(fp);
  12. while(1)
  13. {
  14. sleep(5);
  15. }
  16. return 0;
  17. }

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


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

read/write/fsync与fread/fwrite/fflush的关系和区别的更多相关文章

  1. Linux read/write fread/fwrite两者区别

    Linux read/write fread/fwrite两者区别 1,fread是带缓冲的,read不带缓冲. 2,fopen是标准c里定义的,open是POSIX中定义的. 3,fread可以读一 ...

  2. fopen /open,read/write和fread/fwrite区别

    fopen /open,read/write和fread/fwrite区别         转载URL:http://hi.baidu.com/%B9%C8%C9%F1%B2%BB%CB%C0jdp/ ...

  3. 那些年,坑死自己的事之fread/fwrite

    今天继续看牛人做过的东西,这个小程序并不大,加上相当多的注释行,才5000多行.这个小程序是在linux下实现的,之前自己也一直用vi来看并加以更加详细的注释,但是效率实在太低.于是将其转移到wind ...

  4. linux缓冲的概念fopen /open,read/write和fread/fwrite区别

    fopen /open区别 UNIX环境下的C 对二进制流文件的读写有两套班子:1) fopen,fread,fwrite ; 2) open, read, write这里简单的介绍一下他们的区别.1 ...

  5. fread/fwrite

    fread/fwrite第二个参数和第三个参数的区别以及与返回值的关系 size_t fwrite_unlocked(const void * __restrict ptr, size_t size, ...

  6. [Linux]read/write和fread/fwrite有什么区别

    转自:http://blog.csdn.net/xiaofei0859/article/details/51145051 二者都是对文件进行操作,那么二者有什么区别,用的时候该如何选择呢? 1. 区别 ...

  7. fread/fwrite实现复制功能

    1.  fread/fwrite实现复制功能 #include <stdio.h> #include <stdlib.h> #define BUFFSIZE 4096 //执行 ...

  8. C++fread/fwrite的基础用法

    前言 fread是吼东西 应某人要求(大概)科普一下 fread #include <iostream> #include <cstdlib> #include <cst ...

  9. 【C】——fread函数和read函数的区别

    1,fread是带缓冲的,read不带缓冲. 2,fopen是标准c里定义的,open是POSIX中定义的. 3,fread可以读一个结构.read在linux/unix中读二进制与普通文件没有区别. ...

随机推荐

  1. CDN推送

    一.什么是CDN推送 当后端服务器中的DNS有更新的时候,在varnish的缓存中应该及时地同步后端服务器中的内容.相当于清空varnish中的缓存,当下一次进行访问时,直接从服务器中获取新的内容. ...

  2. Linux内存中Swap机制(转)

    在做监控时,发现内存中有一项Swap space,不是很理解,这里查了一些资料: http://blog.sina.com.cn/s/blog_502d765f0100krph.html 在linux ...

  3. poscms基于list标签实现的查询分页功能

    poscms系统本身有一个在查询页(search页面)实现的查询分页功能,基于系统封装的php函数dr_search_url() 但是今天的需求除了导航栏.列表页.详情页都实现查询功能外,关键是有两个 ...

  4. BASE理论

    BASE是Basiclly Available(基本可用),Soft state(软状态),Eventually consistent(最终一致性)三个短语的缩写. BASE是对CAP中一致性和可用性 ...

  5. Springboot项目搭配ELK日志平台

    上一篇讲过了elasticsearch和kibana的可视化组合查询,这一篇就来看看大名鼎鼎的ELK日志平台是如何搞定的. elasticsearch负责数据的存储和检索,kibana提供图形界面便于 ...

  6. 3. 什么是JSR参考实现? - JavaEE基础系列

    本文是JavaEE基础系列的第三节. Java EE简介 - JavaEE基础系列 JSR简介 - JavaEE基础系列 上一节中, 我们介绍了什么是JSR.JSR就是一个提交到JCP的抽象请求,包含 ...

  7. chrome浏览器使用记录

    出现错误 net::ERR_BLOCKED_BY_CLIENT 出现这个错误一般是因为chrome安装了adblocker等这样的插件,这些插件会把路径及文件名中包含广告字样的文字禁止掉,比如:adv ...

  8. 【集成学习】 lightgbm原理

    # lightgbm和xgboost对比: 模型精度:lightgbm≈xgboost 收敛速度:lightgbm>xgboost #

  9. .net core web 中使用app.UseRouter的几种使用方式

    public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory ...

  10. silverlight——多次异步调用的顺序执行

    遇到这样一个功能需求,对于后台的同一个服务调用多次,但要求传入的参数能够再一个执行完之后再进行另一个参数的执行. 由于silverlight支持的是异步调用机制,故无法控制服务调用何时返回.那么如果使 ...