Linux中的文件IO与标准IO以及文件描述符表和缓冲区详解

前言

IO既是输入input和输出output的首字母缩写形式,文件则是一组相关数据的有序集合,即文件IO就是有序数据流相对于计算机的输入与输出(一般来说我们是站在计算机的角度去描述),它描述的是计算机数据流动的过程。所以学习IO可以让我们理解数据的流动,以及正确的控制数据的流动。文件描述符表则是用来管理数据的输入输出,对应的文件描述符则可以找到文件的入口进行管理。

目录

1.文件描述符

2.文件的打开以及文件的输入输出

3.系统和文件的IO即数据流动之间的关系

4.标准IO和文件IO的区别以及缓冲区的刷新条件

5.文件IO和标准IO的区别

6.cpu和内存和硬盘三者之间的关系

7.程序文件执行时的scanf和printf的输入输出理解

1.文件描述符

在linux系统中一开机则会自动打开一表三符,文件描述符表和0,1,2描述符,其中0对应的是标准输入流(stdin),1对应标准输出流(stdout),2对应流(stderr),他们是维持系统基本运转的描述符。文件描述符和流以及系统的关系如下图。

 如图可知,当用户在linux系统中命令行模式进行输入的时候,如输入ls,会自动打开stdin输入流进入shell层,并进行系统调用在由系统进行判断,在进行一次系统调用通过stdout输出流输出到屏幕上展现给用户看,此时ls会停留在缓冲区等待用户输入回车再次输入到shell层,由于本次是带回车的,就会触发shell命令执行ls。由此可知我们整个命令从输入到执行的过程一共进行了5次系统调用(ls两个字符的输入输出四次,最后执行shell命令一次)。

2.那么,我们文件的打开以及文件的输入输出又是怎样的呢?

我们可以吧文件描述符表理解为一个指针数组,0,1,2,3就是他的下表,而里面存放的就是指针。数组里面的0,1,2存放了和系统进行数据交流的入口,后面的3,4...也存放了文件的入口(文件流,也可以理解为文件指针)。

那么当我们打开一个文件的时候,系统会自动分配一片空间,形成一个结构体并返回一个流指针到对应的文件描述符里(可以理解为数组的下标)。这个结构体存放着文件的信息,所以我们可以通过调用文件IO函数或者标准IO函数打开文件,获得返回的文件描述符或是流指针,控制文件描述符找到流指针在找到对应的文件信息结构体,通过这个结构体我们就可以去修改文件,控制文件,如下图。

 

相信大家看了上图已经对如何控制文件有了一个很清晰的概念了。

3.系统和文件的IO即数据流动又是怎么样的关系呢?

还是通过画图的方式展现给大家,首先是数据如何输出到文件当中进行保存的

 通过上图我们可以得知当我们往一个文件里保存数据的整个过程,是不是感觉很相识呢,其实这个过程和我们在命令提示符中输入命令是一样的过程,只是这一次停留在缓冲区之后下一个目标不是我们的stdin输入流了,而是我们相对应的文件流指针。当我们进行保存后就会刷新缓冲区并且进行系统调用找到文件的入口,把数据输出到文件当中。这也是我们有时候不保存意外关闭形成swp文件的根本依赖,swp就是依赖缓冲区中未刷新的数据形成的文件,从新打开后可以选择恢复就会自动输出到对应的文件中,也可以选择删除不要。

明白了文件的输入输出以及文件和系统以及文件描述符表它们之间的关系之后,我们想进行不同文件的数据流动以及对某些文件进行修改就很简单了,只需要借助文件IO函数或者标准IO函数得到文件入口(流指针或文件描述符),就可以对文件进行输出,或是借用文件中的数据对我们的系统进行输入。

安抚

通过上图可以得知,实现不同文件间的IO只需要在主程序中调用函数打开文件获得文件入口,之后就可以进行文件间的输入输出了。

4.关于标准IO和文件IO的区别以及缓冲区的刷新条件

            1>标准IO拥有缓冲区,文件IO没有
            2>标准IO是在文件IO的基础上封装缓冲区形成
            3>标准IO是应用层IO  来自C库 
              文件IO是底层IO    来自系统
                            ----文件IO在移植性上面,优于标准IO  
 缓冲区的分类:
 1

)全缓冲:主要针对普通文件
        只有当缓冲区域满的时候,才会执行IO操作

2)行缓冲:程序文件调用函数进行标准输入,标准输出(如scanf,printf)
        当缓冲区满或者遇到'\n';
        
3)不缓冲:标准错误输出(perror)
        直接输出      

5.相信看完前面的朋友们已经可以很轻松的理解上面的这些话了,文件IO和标准IO最大的区别就在于有没有缓冲区。

 

 上面两个图就很清晰的说明了标准IO和文件IO的区别,如果是标准IO只需要把1.c的数据传入到2.c中只需要两次系统调用,而文件IO则需要很多次。文件IO相比于标准IO极大的占用了系统资源,需要多次调用CPU,比较浪费资源,容易拖累其他进程,但文件IO的的响应速度要优于标准IO。

6.如果还有不理解的小伙伴可以看下图,cpu和内存和硬盘三者关系

这张图很好的说明了CPU和内存以及硬盘之间的关系,我们的数据文件1.c,2.c都被保存在硬盘中,当使用标准IO是CPU会一次性把所有数据取出来放入输入缓冲区,然后在输入主程序的变量中。输出则是主程序把变量的数据输出到缓冲区中,在通过CPU一次性输出到2.c中。使用标准IO,那么在缓冲区和主程序产生数据交互的这个过程CPU就可以区做其他事,降低了CPU的占用率。

7.最后关于printf和scanf这种程序文件执行中产生的数据输入输出就很好理解了

主程序打开,在运行过程中printf需要输出数据,就先在内存中完成主程序和缓冲区的数据交互,最后由CUP一次性拿走输出。当然这个过程我们可以利用缓冲区的刷新机制来控制输出,比如换行,如果不换行CPU就会等待程序结束或者缓冲区满了在一次性从缓冲区中拿走数据输出到屏幕上。输入也是一个道理,先是主程序允许输入后,我们输入数据,在根据不同的刷新条件去取缓冲区中的值输入到对应的变量空间中。(%d%c%s的刷新条件都不一样)

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值