前言: 文件=内容+属性 要向访问文件就要打开文件——>用进程来打开——>要把文件先加载到内存中——>
一个进程可以打开多个文件,OS中也有可能多个进程打开了多个文件 文件以多,就需要进行管理,——先描述再组织没有被打开的文件是在磁盘中的
用进程打开文件
用C语言的库函数打开文件
fopen(“要打开文件的路径”,“打开方式”)
w:写的方式打开文件,文件不存在会自己创建文件,
对文件进行写入操作:
通过以w方式打开文件,文件内容会被清空这一特征,可以联想到我们的echo> 重定向命令——重定向命令的代码封装的就是以w打开的代码。
以a(追加)的方式打开文件
再进行打开写入关闭时就不会覆盖之前写的内容,而是会在尾部写入
联想到我们的命令:echo>> 追加重定向——追加重定向的代码也是用的a打开方式的代码
以r读的方式打开
有三个文件是在系统启用时就会默认打开的:
和我们上面用fopen()打开文件返回的FILE*值一样,可以直接使用:
用系统接口打开文件
打开文件时进程干的事,和进程直接关联的是操作系统,所以最底层的打开文件一定是操作系统干的事,然后他在向上封装一些接口,然后让我们可以调用系统接口来打开文件。
open("要打开文件”,打开方式,限权设置)
以写的方式打开,再次打开文件内容清空:
打开文件文件内容追加:
此时我们就发现,这两个系统调用,和我们C语言的以w a 方式打开文件的效果一样
由此我们可以看出,C语言的接口一定是调用了系统的接口
由此也可以看出,C语言返回的FILE*是一个结构体,里里面一定分装了系统调用返回的fd
系统调用打开文件返回的fd是什么呢?
我们可以看出他是一个整数,用来表示每个文件的,
fd的作用
理解一切皆文件
虽然每个硬件底层的读写方法不一样但是,但是我们内存文件结构体里有相同名字的函数指针,当我们堆不同文件进行读写操作的时候,是调用不同文件结构体对象的相同名结构体指针的。
这样就屏蔽了硬件的差异,所以在操作系统看来,一切的东西都是要描绘成相同结构的不同对象来管理的。
fd的分配规则
不难看出因为0 1 2是被默认提前打开的,所以接下来的同一进程中打开的文件的文件描述符按照顺序递增的存储到文件描述符表中的。
但是当我们打开文件之前先把fd=0或者2的默认打开文件关闭时,在打开一个文件,文件的fd就会补上:
但是如果关闭的是1呢?
首先我们要明白C语言中的打印:
本该打印到显示器的内容,却打印到了文件中,这不就是我们的输出重定向嘛
echo > fd=1 log.txt
输入重定向同样也可以用这种方式实现