Linux-文件描述符与IO重定向

357 阅读4分钟

Linux中标准的输入设备默认指的是键盘标准输出设备默认指的是显示器。重定向则改变目标,将原来的标准输入输出设备换成其他的.而本节所要介绍的输入、输出重定向,完全可以从字面意思去理解,也就是:

  • 输入重定向:指的是重新指定设备来代替键盘作为新的输入设备;
  • 输出重定向:指的是重新指定设备来代替显示器作为新的输出设备。

Linux使用特定的符号实现输入输出的重定向.

文件描述符

文件描述符基本概念

文件描述符在形式上是一个非负整数。实际上,它是一个索引值,指向内核为每一个进程所维护的该进程打开文件表。当程序打开一个现有文件或者创建一个新文件时,内核向进程返回一个文件描述符。在程序设计中,一些涉及底层的程序编写往往会围绕着文件描述符展开。

文件描述符就是内核为了高效管理已被打开的文件所创建的索引,用来指向被打开的文件所有执行I/O操作的系统调用都会通过文件描述符。

在进程的进程控制块(PCB)中,保存着一份文件描述符表,文件描述符是该表的索引号,表项指向已打开文件指针

文件描述的取值范围

文件描述符是一个取值范围为 [0,MAX] 的非负整数.对于每一个进程来说,进程需要维护一个进程级的文件描述符表,用于记录该进程需要操作的文件.因此,文件描述符的最大值MAX等于进程可以打开的最大文件数,MAX的取值由操作系统决定.

进程,文件描述符,文件之间的关系

  • 每个文件描述符会与一个打开的文件相对应
  • 不同的文件描述符也可能指向同一个文件,即文件与文件描述符是一对多的关系
  • 相同的文件可以被不同的进程打开,也可以在同一个进程被多次打开
flowchart LR
file([文件])-->file_descriptor1[描述符1]
file([文件])-->file_descriptor2[描述符2]
file([文件])-->file_descriptor3[描述符3]
file_descriptor1-->progress1[进程1]
file_descriptor2--调用1-->progress2[进程2]
file_descriptor3--调用2-->progress2[进程2]

常见文件的文件描述符

Linux中,一切都是文件,包括键盘,显示器等等设备.因此要调用这些设备,同样需要文件描述符.文件描述符就类似于端口号,而标准输入,标准输出和错误输出三种方式,亦或说设备,再或者说是文件,就常见如同HTTP服务占用80端口号一样,这三种方式占用了0...0,0..01,0..02这三个文件描述符.

标准输入输出

名称文件描述符作用
标准输入(STDIN)0默认是键盘,也可以是文件或其他命令的输出。
标准输出(STDOUT)1默认输出到屏幕。
错误输出(STDERR)2默认输出到屏幕。

输入重定向

输入重定向符号

命令符号格式作用
[COMMAND] < [FILES...]将指定文件作为命令的输入设备
[COMMAND] << [STRING]表示从标准输入设备(键盘)中读入,直到遇到分界符才停止(读入的数据不包括分界符),这里的分界符其实就是自定义的字符串

输出重定向

相对于输入重定向,其实输出重定向更常用.

两种输出重定向方式:

  1. 标准输出重定向:将命令正确执行的输出结果写入文件
  2. 错误输出重定向:将命令的报错信息写入文件

两种写入方式

  1. 清空(覆盖)写入:清空文件原有内容
  2. 追加写入:不清除目标文件的内容,以追加的方式写入

输出重定向符号

命令符号格式作用
命令 > 文件将命令执行的标准输出结果重定向输出到指定的文件中,如果该文件已包含数据,会清空原有数据,再写入新数据。
命令 2> 文件将命令执行的错误输出结果重定向到指定的文件中,如果该文件中已包含数据,会清空原有数据,再写入新数据。
命令 >> 文件将命令执行的标准输出结果重定向输出到指定的文件中,如果该文件已包含数据,新数据将写入到原有内容的后面。
命令 2>> 文件将命令执行的错误输出结果重定向到指定的文件中,如果该文件中已包含数据,新数据将写入到原有内容的后面。
命令 >> 文件 2>&1 OR 命令 &>> 文件将标准输出或者错误输出写入到指定文件,如果该文件中已包含数据,新数据将写入到原有内容的后面。注意,第一种格式中,最后的 2>&1 是一体的,可以认为是固定写法。

基本语法:

  • 单个>符号表示清空式写入,>>表示追加式写入.
  • 1表示标准输出重定向,2表示错误输出重定向.