本文最后更新于520 天前,其中的信息可能已经过时,如有错误请发送邮件到big_fw@foxmail.com
一、 文件描述符简介
文件描述符是一个非负整数,内核需要通过这个文件描述符才可以访问文件
文件描述符好比一本书的目录(索引),通过这个索引可以找到需要的内容
在Linux系统中内核默认为每个进程创建三个标准的文件描述符:
0(标准输入,键盘输入的)、1(标准输出,屏幕输出的)、 2(标准错误)
通过查看 /proc/==PID==/fd 目录下的文件,就可以查看每个进程拥有的所有文件描述符
例如: 查看当前shell 的文件描述符
ll /proc/$$/fd

255是一个小技巧,bash用于在重定向时保留这些副本.
当打开文件时,系统内核会为特定的进程自动创建对应的文件描述符
例子:
# tail打开一个文件
tail -f flag
# 获取tail进程PID
pidof tail
# 查看tail进程创建的文件描述符
ll /proc/98/fd


获取pid,然后查看/proc/98/fd pid=98
可以看到存在一个文件描述符 3 索引打开的 /root/flag 文件
二、标准文件描述符
Linux系统将所有设备都当作文件来处理,而Linux用文件描述符来标识每个文件对象。当Linux启 动的时候会默认打开三个文件描述符。
文件描述符 缩写 描述 默认设备
0 STDIN 标准输入 默认设备键盘
1 STDOUT 标准输出 默认设备显示器
2 STDERR 标准错误输出 默认设备显示器
我们与计算机之间的交互是我可以输入一些指令之后它给我一些输出。
文件描述符0:理解为我和计算机交互时的输入,而这个输入默认是指向键盘的;
文件描述符1:理解为我和计算机交互时的输出,而这个输出默认是指向显示器的;
文件描述符2:理解为我和计算机交互时,计算机出现错误时的输出,而这个输出默认是和文件描述符1指向一个位置;