linux基础(IO)中

目录:

          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当中  -------------  这也就是重定向的原理

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值