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()函数将缓冲区刷新,这样数据就会被立刻写入文件而不用等到程序结束(因为之前的数据都在缓冲区里)。
下面通过一个简单的例子让小伙伴们 加深理解:
- int main()
- {
- FILE *fp = fopen("./file.txt","a");
- if(fp == NULL)
- {
- printf("open file err!\n");
- return -1;
- }
- fwrite("hello",5,1,fp);
- //fflush(fp);
- close(fp);
- while(1)
- {
- sleep(5);
- }
- return 0;
- }
如上程序,当程序一直不退出的时候,虽然已经调用了fwrite但是数据却在缓冲区里,而并不在文件中,这时你可以查看改路径下的file.txt文件,你会发现文件已经建立但是大小为0,如果你在fwrite之后用fflush函数后数据就会立刻写入文件,我总结就这么多,不喜勿喷,希望对小伙伴们有帮助。
read/write/fsync与fread/fwrite/fflush的关系和区别的更多相关文章
- Linux read/write fread/fwrite两者区别
Linux read/write fread/fwrite两者区别 1,fread是带缓冲的,read不带缓冲. 2,fopen是标准c里定义的,open是POSIX中定义的. 3,fread可以读一 ...
- 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/ ...
- 那些年,坑死自己的事之fread/fwrite
今天继续看牛人做过的东西,这个小程序并不大,加上相当多的注释行,才5000多行.这个小程序是在linux下实现的,之前自己也一直用vi来看并加以更加详细的注释,但是效率实在太低.于是将其转移到wind ...
- linux缓冲的概念fopen /open,read/write和fread/fwrite区别
fopen /open区别 UNIX环境下的C 对二进制流文件的读写有两套班子:1) fopen,fread,fwrite ; 2) open, read, write这里简单的介绍一下他们的区别.1 ...
- fread/fwrite
fread/fwrite第二个参数和第三个参数的区别以及与返回值的关系 size_t fwrite_unlocked(const void * __restrict ptr, size_t size, ...
- [Linux]read/write和fread/fwrite有什么区别
转自:http://blog.csdn.net/xiaofei0859/article/details/51145051 二者都是对文件进行操作,那么二者有什么区别,用的时候该如何选择呢? 1. 区别 ...
- fread/fwrite实现复制功能
1. fread/fwrite实现复制功能 #include <stdio.h> #include <stdlib.h> #define BUFFSIZE 4096 //执行 ...
- C++fread/fwrite的基础用法
前言 fread是吼东西 应某人要求(大概)科普一下 fread #include <iostream> #include <cstdlib> #include <cst ...
- 【C】——fread函数和read函数的区别
1,fread是带缓冲的,read不带缓冲. 2,fopen是标准c里定义的,open是POSIX中定义的. 3,fread可以读一个结构.read在linux/unix中读二进制与普通文件没有区别. ...
随机推荐
- java中+=详解 a+=b和a=a+b的区别
short a=10; a+=4; System.out.println(a); 1.第一段代码的输出结果为14.执行流程是首先声明变量,判断赋给变量的初始值是否在short类型范围内,如果在则进行强 ...
- 如何利用$_SERVER["PHP_SELF"]变量植入script代码?
假如我们是黑客,可以诱骗用户访问如下链接, 相当于用户会在浏览器地址栏中输入以下地址: http://www.xxx.com/test_form.php/%22%3E%3Cscript%3Ealert ...
- MB到片组的映射
待分析 链接原文: http://blog.csdn.net/mr_phy/article/details/61638262
- 使用stringstream类
当需要格式化int类型为字符串时,可以使用这个类, 需要包含这个文件头: #include <sstream> 然后这样使用: //打开保存进度的RPG文件. std::stringstr ...
- C# 加密狗 超级狗 加密程序 程序授权示例 程序授权验证
本篇针对超级狗进行讲解,对应的超级狗套件的工具包版本为2.4版本.超级狗图片如下: 主要包含两个狗,一个是超级狗,一个是开发狗,在本博文中都是必须的.首先先安装光盘中的开发套间. 接下来就开始演示一个 ...
- phpcms后台主菜单不显示
phpcms\modules\admin\templates\main.tpl.php 注释掉既可
- Intro to DBSCAN
DBSCAN Density-Based Spatial Clustering of Application with Noise It can discover cluster of arbitra ...
- 使用python处理selenium中的鼠标悬停问题
# 导入selenium中的actionchains的方法 from selenium.webdriver.common.action_chains import ActionChains #识别需要 ...
- Orders
The stores manager has sorted all kinds of goods in an alphabetical order of their labels. All the k ...
- 《DSP using MATLAB》示例Example7.8
窗函数的设计思想就是选择一个理想的频率选择滤波器(通常其脉冲响应函数是 非因果.无限长的),然后截断(取窗)这个无限长脉冲响应,得到一个线性相位.因果的 FIR滤波器.频率域示意图如下: 我们的目的: ...