以open函数举例
调用方式
open函数是Linux内核调用的api,返回值是文件描述符
fopen函数是C语言标准库里面的函数,返回值是文件指针,在不同的操作系统下,调用不同的内核api
移植性
open函数的Linux内核调用的api,只有在linux操作系统下才能调用,移植性有限
fopen函数是基于C语言标准库的,只要包含了stdio.h头文件,就可以调用,移植性良好
适用范围
由于Linux系统下所有设备包括软件都是以文件形式操作,所以可以通过open函数来调用文件,或者硬件
fopen只能操作普通正规文件类型的文件
运行层次
open函数属于低级io,离系统内核较近,用户在用户态调用open函数,运行open函数时需要向Linux内核发送指令,操作系统的状态会从用户态转向核心态,由Linux内核执行open函数
fopen函数属于高级io,离系统内核较远,用户在用户态调用fopen函数,运行时大部分内容都在自己的缓冲区操作,对内核的依赖性较小
缓冲
open函数运行在非缓冲文件系统,非缓冲文件系统较为依赖操作系统内核,让系统内核来对文件进行操作,是系统级的输入输出,因而不需要返回文件类型的指针,也不需要开辟缓冲区,只能读写二进制文件,但是速度快,效率高
fopen函数运行在缓冲文件系统,缓冲文件系统会在操作文件时,在内存开辟一块缓冲区内存,为操作的文件使用。读文件时,从磁盘读到的文件先读入缓冲区,缓冲区读满了之后,再依次将缓冲区的内容读给目的地址;写文件时,现将源地址的文件写到缓冲区,缓冲区写满了之后,再依次将缓冲区的内容写入到磁盘文件。缓冲区越大,操作外存的次数越少,减少内外存切换的时间,执行速度就越快
open函数每次读写都需要在用户态和核心态之间切换,多次读写,切换次数较多;fopen函数由于在用户态就有了缓冲区,多次读写会等缓冲区读写满了,再转换到核心态,所以用户态和核心态之间的切换较少。顺序访问时,fopen函数的效率较快,而随机访问时,open函数的效率较快