博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
linux函数之------fread和read的区别
阅读量:3638 次
发布时间:2019-05-21

本文共 1640 字,大约阅读时间需要 5 分钟。

1,fread/fwrite是带缓冲的,read/write不带缓冲.

2,fopen是标准c里定义的,open是POSIX中定义的.

3,fread可以读一个结构.read在linux/unix中读二进制与普通文件没有区别.

4,fopen不能指定要创建文件的权限.open可以指定权限.

5,fopen返回指针,open返回文件描述符(整数).

6,linux/unix中任何设备都是文件,都可以用open,read.

如果文件的大小是8k。

你如果用read/write,且只分配了2k的缓存,则要将此文件读出需要做4次系统调用来实际从磁盘上读出。

如果你用fread/fwrite,则系统自动分配缓存,则读出此文件只要一次系统调用从磁盘上读出。

也就是用read/write要读4次磁盘,而用fread/fwrite则只要读1次磁盘。效率比read/write要高4倍。

如果程序对内存有限制,则用read/write比较好。

都用fread 和fwrite,它自动分配缓存,速度会很快,比自己来做要简单。如果要处理一些特殊的描述符,用read 和write,如套接口,管道之类的

系统调用write的效率取决于你buf的大小和你要写入的总数量,如果buf太小,你进入内核空间的次数大增,效率就低下。而fwrite会替你做缓存,减少了实际出现的系统调用,所以效率比较高。

如果只调用一次(可能吗?),这俩差不多,严格来说write要快一点点(因为实际上fwrite最后还是用了write做真正的写入文件系统工作),但是这其中的差别无所谓。

 

=======================================================

read/write 系统调用

read函数从打开的设备或文件中读取数据。

#include 
​​​​​​​ssize_t read(int fd, void *buf, size_t count);
返回值:成功返回读取的字节数,出错返回-1并设置errno,如果在调read之前已到达文件末尾,则这次read返回0

参数count是请求读取的字节数,读上来的数据保存在缓冲区buf中,同时文件的当前读写位置向后移。注意这个读写位置和使用C标准I/O库时的读写位置有可能不同,这个读写位置是记在内核中的,而使用C标准I/O库时的读写位置是用户空间I/O缓冲区中的位置。

 

fread就是通过read来实现的,fread是C语言的库,而read是系统调用

但是差别在read每次读的数据是调用者要求的大小,比如调用要求读取10个字节数据,read就会读10个字节数据到数组中,而fread不一样,为了加快读的速度,fread每次都会读比要求更多的数据,然后放到缓冲区中,这样下次再读数据只需要到缓冲区中去取就可以了。
fread每次会读取一个缓冲区大小的数据,32位下一般是4096个字节,相当于调用了read(fd,buf,4096)
比如需要读取512个字节数据,分4次读取,调用read就是:
for(i=0; i<4; ++i)
read(fd,buf,128)
一共有4次系统调用
而fread一次就读取了4096字节放到缓冲区了,所以省事了

 

fwrite也是通过write实现的,fwrite是C语言的库,而write是系统调用

差别在write每次写的数据是调用者要求的大小,比如调用者要求写入10个字节数据,write就会写10个字节数据到内核缓冲区中,所以依然涉及到用户态与內核态之间的切换,操作系统会定期地把这些存在内核缓冲区的数据写回磁盘中。而fwrite不一样,fwrite每次都会先把数据写入一个应用进程缓冲区,等到该缓冲区满了,或者调用类似调用fflush这种冲洗缓冲区的函数时,系统会调用write一次性把相应数据写进内核缓冲区中。同样减少了系统调用(即write调用)

 

转载地址:http://pouyn.baihongyu.com/

你可能感兴趣的文章
不驰于空想,不鹜于虚声!
查看>>
2021考研大军
查看>>
考研倒计时282
查看>>
JAVA的学习笔记01
查看>>
JAVA的学习笔记02(面向对象的语言我要学,学了就能找对象)
查看>>
JAVA学习笔记03今天运行第一个java的程序运行提示 java HelloWorld 命令,提示“错误: 找不到或无法加载主类”
查看>>
JAVA学习笔记04Java编程基础(基本语法格式)(所有编程语言都需要了解的基础知识)
查看>>
JAVA学习笔记05JAVA中的变量(变量的定义、变量的数据类型、变量的类型转换、变量的作用域)
查看>>
全栈工程师
查看>>
JAVA学习笔记06JAVA的运算符(算数运算符、赋值运算符、比较运算符、逻辑运算符、运算符的优先级)
查看>>
JAVA笔记07选择结构语句(if条件语句、switch条件语句、while语句、for语句、嵌套语句等)
查看>>
JAVA学习笔记08方法和数组(方法的重载、数组的定义、数组的常见操作、多维数组)
查看>>
为什么说Java是最受欢迎的编程语言?原因在这7点
查看>>
JAVA学习笔记09面向对象的概念、 类与对象
查看>>
JAVA(超市购物程序设计)
查看>>
JAVA学习笔记10面向对象(构造方法、this关键字、垃圾回收、static关键字、成员内部类、)
查看>>
JAVA学习笔记11(类的继承、final关键字、抽象类和接口)
查看>>
最好安装的MATLAB 2018a安装教程
查看>>
好久不见,疫情也慢慢消散了!
查看>>
华清远见的fs4412开发板学习笔记(一)
查看>>