目录:
1.回顾上一篇的文件系统调用接口
2.返回值文件描述符
3.文件描述符分配规则
----------------------------------------------------------------------------------------------------------------------------
1.回顾上一篇的文件系统调用接口
open : 文件系统调用接口
那么我们文件也已经可以打开成功了,我们现在如何向文件当中写入呢??
那么现在我向这个文件写入成功了,那么现在我想读取这个文件呢???
2.返回值文件描述符
可发现为什么文件描述符值是从3开始的呢,按道理来说打开错误是返回小于0的数,那打开成功也应该从 0 1 2 开始的呀,可为什么是从3开始的呢???
那么操作系统会如何管理呢 ??? 先描述再组织
操作系统为了进程和文件当中产生关系,那么在我们进程 的内核当中包含了一个结构,这个结构的名字叫做 --- struct files_struct -- 这个结构当中又包含了一个数组
这样子我们的 0 1 2 是不是就被占用
这也就相当于我们在OS层面上, 0 1 2 描述符分别被申请成了保存标准输入键盘文件、显示器显示器文件,分别保存他们3个文件的各自地址,
当你在打开一个新的文件时,在内存里面就需要形成struct file 的结构,然后从众多描述符中把3分配给你,,怎么分配,就是把你struct file的结构体地址填入3号文件描述符内
fd : 本质是内核中是进程和文件关联的数组的下标!!!!!!!!
------------------------------------------------------------------------------------------------------------------------------
3.文件描述符分配规则
我们一直在说标准输入,标准输出,标准错误等等一堆的概念,0代表 的就是我们的键盘,那么我们是不是可以直接从0开始读,往1开始写呢???
既然我们可以调用write往 1 2可以直接写入,本质就是往我们的显示器上打印,那么又什么区别呢????(后面在回答)
----------------------------------------------------------------------------------------------------------------------------
我们还有一个0呢?? 标准输入呢---换句话说我们是不是可以通过我们的read从我们的显示器上读数据呢?????
上面,我们证明了 0 1 2 也是可以拿来读写的
---------------------------------------------------------------------------------------------------------
我们现在来研究一下文件描述符的分配规则
文件描述符的分配规则 : 给新文件分配的fd,是从fd_array中找一个最小的,没有被使用的文件描述符给你的,作为新的fd!!!
上面我们把 0 2这两个文件给关了,可就是没有关1我们在来关1看看
我们再换一堆代码来试试看
本来应该显示到显示器中,但是却被 “显示”到文件内部 !!!!-------输出重定向
可为什么这段代码会出现这样的现象呢????
我们这里调用printf实际是向stdout进行打印,我们可以大胆预测一下,FILE这个结构体一定包含了一个整数,是对应在系统层面的,这个文件的打开对应 的fd
所以我们刚刚的printf 是往stdout里写,stdout里面封装了一个fd,它的fd是1,所以它只关心1这个数字,而实际上呢,我们printf在进行写入时,我已经把1原来指向的显示器文件,指向了log.txt文件,而1这个下标的没变的,而printf照样只认识1,所以它向1打印了,本来应该打印到显示器时,结果打印到了log.txt当中 ------------- 这也就是重定向的原理