文件操作原理简述
1.文件描述符
1.1 对于linux内核来说,所有的打开文件都是由文件描述符(fd)来进行引用的,文件描述符是一个非负整数
当你打开一个已经存在的文件或创建一个新的文件的时候,内核就会像进程返回一个fd,当你进行其他操作都是建立在fd之上的,比如进行文件的读写操作,用open或creat函数来得到fd,将fd作为参数传递给read和write函数,才能进行操作,所以第一步必须进行文件的打开或者创建来得到fd!
2.2 在UNIX shell用宏定义了标准输入输出和标准错误,
0:标准输入
1:标准输出
2:标准错误输出
比如我想用键盘输入一个 hello,然后输出
0代表标准输入,将输入的字符存在readbuf中,输入5个字节的长度
1代表 标准输出,将readbuf里面暂存的数据输出,输出的长度为readbuf的长度。
3.3 文件描述符在一个进程中代表特定的含义,当我们open一个文件时,操作系统就在内存里构建了一些数据来表示这个动态文件,然后返回给应用程序一个数字作为文件描述符,完成操作以后一定要记得关闭文件,不关闭可能会损坏文件或者造成数据的丢失。
原因,第一点要明确内核运行的机制,搞清楚这个就要明白什么是动态文件,什么是静态文件
静态文件:存在于磁盘中的文件,就像我们打开电脑,桌面上显示的那些app,qq,微信等。
动态文件:我们open静态文件以后,就会在linux产生一些结构体,比如fd,buf,然后buf会复制一份静态文件中的数据进行操作,当我们close以后,操作以后的动态文件就会被写入到磁盘当中,如果没有close,就不会将操作过的数据写入到磁盘。所以
文件操作步骤一般分为:
打开/创建文件->读取文件/写入文件->关闭文件
4.4 我们不直接对块设备进行操作是因为块设备本身读写非常不灵活,是按块读写的,而内存是按字节单位操作的,而且可以随机操作,很灵活。
比如我要在hello里面把e改为0,如果按照块进行操作,就必须操作整个hello,而不能单独修改某一位,所以一般不按照块块操作。