目录
前言
上一篇博客学习完文件编程的基础内容后,今天我们来学习一下文件操作的原理到底是什么?让我们一起来探索和学习。
提示:以下是本篇文章正文内容,下面案例可供参考
一、文件描述符
在文件编程中我们不论是open(),write(),read()函数我们都用到一个叫做文件描述符,对于文件描述符我们下面来学习。
1.概念
文件描述符:对于内核而言,所有的打开文件都由文件描述符引用(索引)。文件描述符是一个非负整数,当打开一个现存文件或者创建一个新文件时,内核向进程返回一个文件描述符。当读写一个文件时,用open和creat返回的文件描述符标识该文件,将其作为参数传递给read和write。
2.Linux系统默认的文件描述符
0 1 2
标准输入 标准输出 标准错误
2.1代码示例
2.2 代码分析
readBuf存取从键盘标准输入的5byte大小的数据,write()函数中标准输出readBuf中的数据。
2.3 运行结果:
guest-djB5pf@Embed_Learn:~$ ./a.out
hello
hello
done!
二、文件操作原理
1.静态文件和动态文件
1.1 静态文件:文件平时是存放在区块设备中的文件系统中的,把这种文件叫做静态文件。
1.2 动态文件:当我们去open打开一个文件时,Linux内核做的操作包括:内核在进程中建立一个打开文件的数据结构,记录下我们打开的这个文件,内核在内存中申请一段内存,并且将静态文件的内容从块设备中读取到内核中特定的地址管理存放,这就叫做动态文件。
1.3其他
打开文件以后都这个文件的读写操作,都是针对内存中的动态文件的,而不是针对静态文件的。当然,我们对动态文件进行读写以后,此时内存中动态文件和块设备文件中的静态文件就不同步了。当我们close动态文件时,close内部内核将内存中的动态文件的内容去更新(同步)块设备中的静态文件(读写完以后关闭文件的原因)。
2.为什么这么设计?不直接对块进行操作
块设备本身读写非常不灵活,是按块读写的,而内存是按字节单位操作的,而且可以随机操作,很灵活。比如:一块占100个字节,里面存储的数据如果对某个字节的数据要进行修改的话是无法实现的,因为块是以整块为单位操作的,同样的问题对内存而言就变的非常简单,容易操作,因为内存中是以字节为单位操作的。
总结
学习了文件操作的原理之后,对于文件编程中的文件描述符等有了一个更深层次的掌握,文件的打开、读写、关闭,从静态文件到动态文件。