概述
标题
- 文件描述符的本质:
- 文件描述符的分配方式
- 文件流指针和文件描述符的区别:
- 重定向:
- 重定向函数:
文件描述符的本质:
要从内核源码分析,进程运行起来后在内核中是一块task_strck结构体(PCB)
- PCB中有一个struct files_struct* files的指针,该指针指向对应的结构体struct files_struct;
- 在这个结构体中有一个fd_array的数组,数组的每一个元素是struct_file* ;
- 数组的下标称为文件描述符,各元素指向struct file结构体;
- 这个结构体里保存了文件的元信息(文件名称,文件大小,inode节点号,文件权限,文件所有者,文件所属组,文件时间等信息)
这些信息描述了文件在磁盘中对应的文件
- 0:标准输入
- 1:标准输出
- 2:标准错误
- 3:默认新打开文件的文件描述符
文件描述符的分配方式
等同于fd_array数组是怎么开辟元素的,给一个元素赋值后,对应的下标才有含义
最小位分配原则,简单的说就是数组有效下标加起来值要最小
- 找到当前没有被使用的最小的一个下标,作为新的文件描述符
- close(0)后,再次查看会将3放在0的位置
文件流指针和文件描述符的区别:
我们已经知道文件描述符的实质是数组的下标
文件流指针
- 文件流指针FILE是C标准库的内容,fopen函数是一个库函数,其返回值是用一个FILE* 类型接收
- FILE是一个重命名的结构体,在这个结构体中有三个重要的变量:
- 读缓冲区,写缓冲区,int _fileno
1.读缓冲区有三个指针;
2.写缓冲区;
- 这两个缓冲区和在进程终止中的exit函数所说的缓冲区一样,之前所说读到刷新缓冲区就是刷新现在所学习的缓冲区;
- printf把要输出的内容放在了写缓冲区,加上换行符就是让在换行时刷新缓冲区;
- 通过fileno将内容输入到文件或者屏幕上
3.int _fileno:
- fileno里面保存的是文件描述符,
- 所以通过库函数操作文件流指针时,本质上是通过fileno操作内核中的文件描述符
一个文件流指针只能保存一个文件描述符;
一个文件描述可以被多个文件流指针使用
也就是说:
- 一个进程创建后要想用到标准输入,标准输出,标准错误这三个文件描述符;
- 等同于要以文件流指针方式使用,需要创建三个文件流指针,每个文件流指针中保存不同的文件描述符
结论:
- 文件流指针和文件描述符的关系是:文件流指针当中包含文件描述符
- C标准库对应的缓冲区:读缓冲区和写缓冲区
在exit和_exit区别有一个刷新缓冲区,这个刷新缓冲区就指的是struct _IO_FILE
结构体中的缓冲区
重定向:
>清空重定向
>>追加重定向
- 重定向符号:为了将原来在屏幕中打印的内容写到文件中
- echo+内容+重定向符+文件,不写重定向符+文件就直接打印在屏幕上
使用:
- echo “haha” > 1.text
查看文件后,内容显示是haha
- echo “enen” > 1.txt
查看文件后,内容显示是enen
- 如果enen使用追加重定向,文件内容就是
haha enen
- 如果直接使用
echo +字符串
,会直接将该字符串打印到屏幕上
要理解重定向应从文件描述符的角度理解
代码:
- 操作系统创建了一个进程后,进程中有3个文件描述符,标准输入输出错误;
- 在文件中打开1.txt文件会创建一个3号文件描述符,这个文件描述符也会对于有一个struct_file的结构体;
- 这4个struct file在磁盘中会对应一个文件,这个文件叫做在
dev目录下pts文件夹下的文件3
该文件类型是c,设备文件- 012文件描述符和3号描述符对应的文件不一样
- 3号文件描述符对应的是1.txt文件,若想让在标准输出输出的内容输出到文件中;
- 就要将1号文件描述符的strcut_file*重新指向3号描述符指向的struct_file中;
- 也就是输出到1.txt中,此时1号和3号文件描述符都指向1.txt文件,均可操作该文件
以上就是重定向的本质:将文件描述符下标对应元素中的结构体指针指向的结构体更改成为另外的结构体
重定向函数:
dup2重定向函数
运行结果:
- 结果haaaa本应输入到屏幕上,但是重定向后输出到1.txt文件中
最后
以上就是安静路灯为你收集整理的Linux:文件描述符&重定向的全部内容,希望文章能够帮你解决Linux:文件描述符&重定向所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复