文件描述符

一.文件描述符:是一个非负的索引值。

在Linux下,对文件的操作都是通过文件描述符来进行的。linux进程默认会打开三个文件描述符,分别是

0 stdin 标准输入 对应设备:键盘

1 stdout 标准输出 对应设备 :显示器

2 stderror 标准错误 对应设备:显示器

文件描述符

我们知道,打开一个文件相当于创建一个进程,就会创建一个task_struct,在task_struct里面有一个file * 的指针,指向一个struct files_struct,里面有一个fd_array的数组,数组里的每一个每一个元素都是一个指向文件的指针,所以实际上fd_array是一个指针数组,数组里的元素类型是 struct file*。

数组里的对应的下标就是文件描述符,files_struct是一个文件描述符表

所以只要拿到文件描述符,就可以拿到相对应的文件

二.文件描述符的分配原则

打开一个文件

文件描述符
文件描述符

可以看到fd=3

文件描述符
文件描述符

关闭了0号描述符所对应的文件,再观察就看到fd = 0

由此得出文件描述符的分配原则是从下标为0开始,找第一个未被占用的位置

三.重定向(>)的本质

我们来看一段代码
文件描述符
文件描述符

运行程序,并没有在终端显示,但是查看file.c的内容,可以看到fd = 1,这就是重定向的现象,把原本输出到终端的信息输出到文件里。

文件描述符

根据代码的顺序,先关闭了文件描述符1所对应的文件,实际上是切断stdout文件和下标为1的联系,然后打开file.c,就必须有一个fd_array数组的下标要指向file.c,根据文件描述符分配原则,可得治此时fd_array下标为1的指针指向了file.c,所以凡是要写到stdout文件里地数据都写到了file.c里面,就导致了文件里有内容而终端不会显示。这就是重定向的本质。

四. dup2函数

文件描述符

dup2函数:新的成为老的一份拷贝,即新的文件描述符指向的是老的文件描述符的内容。新老指向同一份文件

文件描述符
文件描述符

使1的文件描述符指向了file.c,所以在终端不会显示,在file.c有内容。