C语言IO操作fread/fwrite/fflush-创新互联

参考
1
2

成都创新互联从2013年成立,是专业互联网技术服务公司,拥有项目网站制作、做网站网站策划,项目实施与项目整合能力。我们以让每一个梦想脱颖而出为使命,1280元大厂做网站,已为上家服务,为大厂各地企业和个人服务,联系电话:13518219792

IO操作

fread/fwrite/fflush:

  1. c语言标准规定的io流操作,建立在read/write/fsync之上;
  2. 在用户层, 又增加了一层缓冲机制,用于减少内核调用次数,但是增加了一次内存拷贝;

read/write/fsync:

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

两者之间的关系如下:
在这里插入图片描述
可以将fread,fwrite是一种批量写入,而read,write是单次写入的形式来理解。
write是系统调用,每次需要将数据写到磁盘,写的大小是要求的大小,依然涉及频繁的用户态和内核态切换;
fwrite是库函数,每次将数据写入到缓冲区,等缓冲区满了,一次写入磁盘。或者使用 fflush 冲洗缓冲区;
fflush:是把C库中的缓冲调用write函数写到磁盘(其实是写到内核的缓冲区)。
fsync:是把内核缓冲刷到磁盘上。

注意:

(1)fwrite
fwrite每次将数据写入到缓冲区,等缓冲区满了,一次写入磁盘;存在延迟写入、或对线程访问文件数据异常问题;为解决该问题,可使用fflush()函数,及时刷新缓存、写入;
(2)fflush:标准I/O函数(如:fread,fwrite)会在内存建立缓冲,该函数刷新内存缓冲,将内容写入内核缓冲,要想将其写入磁盘,还需要调用fsync。(先调用fflush后调用fsync,否则不起作用)。
(3)fflush()与fsync()的联系:
对于输入设备,调用fsync/fflush将清空相应的缓冲区,其内数据将被丢弃;对于输出设备或磁盘文件,fflush只能保证数据到达内核缓冲区,并不能保证数据到达物理设备, 因此应该在调用fflush后,调用fsync(fileno(stream)),确保数据存入磁盘。
(4)fdatasync:类似fsync,但它只影响文件的数据部分;
fdatasync与fsync的区别在于fdatasync不会flush文件的metadata信息;这个是为了减少对磁盘的操作;如果以块为单位知道写入多少数据,可以使用fdatasync;
如下:

#include#include#include#includeint main(int argc, char **argv){FILE *fp = fopen("test.txt","w");
        char *line ="Test";
        char *fill ="\0";
        fwrite(fill, 1, 100*strlen(line), fp);
        fflush(fp);
        fsync(fileno(fp));
        rewind(fp);
        for (int i = 0; i< 100; i++){fwrite(line, strlen(line), 1, fp);
                fflush(fp);
                fdatasync(fileno(fp));
        }
}

你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧


当前标题:C语言IO操作fread/fwrite/fflush-创新互联
文章源于:http://scyanting.com/article/hecde.html