文件描述符
一.文件描述符:是一个非负的索引值。在Linux下,对文件的操作都是通过文件描述符来进行的。linux进程默认会打开三个文件描述符,分别是0stdin标准输入对应设备:键盘1stdout标准输出对应设备 :显示器2stderror标准错误对应设备:显示器我们知道,打开一个文件相当于创建一个进程,就会...
·
一.文件描述符:是一个非负的索引值。
在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有内容。
更多推荐
已为社区贡献1条内容
所有评论(0)