文件描述符
什么是文件描述符?
先来说说文件:
当我们打开一个文件时,操作系统为了管理该文件,会创建一个数据结构来描述它,记录他的各种信息,这个数据结构就是FILE结构体,一个FILE结构体就表示了一个已经打开的文件。
进程中使用open函数打开某个文件,前提是需要我们将进程与文件联系起来。所以进程PCB中就有一个* files指针,这个*files指针指向一个数组files_struct,数组内每个元素都对应了一个文件指针,文件指针指向各个FILE结构体。
而文件描述符就是这个数组的下标,根据数组的下标可以找到对应的文件指针,也就能操作文件了。
说的话可能可能还不够清楚,我们直接上图:
系统怎么样通过文件描述符找到对应的文件?
当进程中要对文件进行操作时,就会从进程PCB中读取*files指针,找到对应的文件表files_struct,再通过文件描述符找到数组对应的文件指针,对文件进行操作。
文件描述符的一些规则
- 根据上图,我们发现,数组下标0,1,2对应了标准输入,标准输出,标准错误输出,这并不是偶然,每一个文件打开时都会自动产生3个默认的文件描述符“标准输入,标准输出,标准错误输出”,且顺序为0,1,2.
- 在新打开文件时,文件描述符的分配原则是:优先用未被使用的最小描述符.
文件重定向
什么是文件重定向
先来看一段代码:
#include<stdio.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<stdlib.h>
int main()
{
close(1);
int fd=open("test.txt",O_WRONLY|O_CREAT ,0664);
if (fd < 0)
{
perror("open error");
return -1;
}
printf("fd: %d\n",fd);
fflush(stdout);
}
close(fd);
exit(0);
}
我们发现,本应该写到屏幕上的fd,却写入到了test.txt文件中,这就是文件重定向.
先上图:
代码中先是关闭了1号描述符,也就是标准输出,而后打开test.txt文件,根据分配规则,test.txt的文件描述符为1,当再次使用文件描述符输出时,本应该输出到屏幕的文本就写入到test.txt中了.
文件重定向的用法
与命令行搭配使用:
标准输入重定向定义: 原本从标准输入读取数据重新定向为从其他文件读取数据
标准输出重定向定义: 将原来要输出到标准输出的内容,重定向后输出到指定的其他文件
< 标准输入重定向
> 标准输出重定向 清空原有内容后添加新内容
>> 标准输出重定向 向原有内容下方添加新内容
ls >/dev/null 2>&1
标准输出(1)重定向为/dev/null 标准错误输出(2)指向(1)(也指向/dev/null)
ls 2>&1 /dev/null
标准错误输出(2)重定向为标准输出(1),标准输出(1)重定向为/dev/null