I/O重定向详解
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了I/O重定向详解相关的知识,希望对你有一定的参考价值。
参考技术A shell中经常会使用到IO重定向,0、1、2为文件描述符在默认情况下,分别表示进程的标准输入、标准输出、标准错误输出。I/O重定向可以将这些标准的输入输出重定向到其他文件上,例如上面语句作用是,将标准输出和标准错误输出重定向到文件/dev/null这个黑洞文件里面,即不输出
shell常用的方法如下
说明io重定向先简单说明内核如何表示一个打开的文件,在一个进程的内核结构中维护着两张表表示该进程已打开的文件(这里简单说明,并不严谨),可以如下所示
用户层打开一个文件内核将分配一个fd和file结构并填入进程的fd和file表中,fd和file保持对应的关系,io重定向即可以修改这种对应关系,内核提供dup和dup2等系统调用完成这项功能
已dup2为例
2>&1对应调用dup2(1,2)
调用后fd和file的对应关系将变为如下形式,其中file2标识为灰色表面内核可能关闭file2结构
了解上述原理后简单说明以下两者的区别,通过实例图应该比较清楚
对于上述原理理解后对应IO重定向应该有比较形象的理解了,但是还是存在一些盲点,即被重定向的文件描述符是一个未打开过的文件,还是一个打开的文件,如果已打开,被重定向后,源文件是否会被关闭,带着这些疑问,看看内核源码是怎么实现的吧,下述源码对应内核版本为2.6.18
通过源码可以比较清楚的发现
dup(m,n)中
1、n可以是一个全新的文件描述符即还未分配给已打开的文件,此时内核将分配该fd,并把该对应关系执行m执行的file结构,并对该file结构引用+1
2、n也可以是一个已经被分配给打开文件的描述符,此时内核将重新将该fd的指向改为m指向的file结构,引用+1,之后对原先n指向的file结构尝试关闭
I/O重定向
顾名思义 将输入/输出重新定义方向
> 覆盖输出重定向
>> 追加输出重定向
2> 错误输出覆盖重定向
2>> 错误输出追加重定向
&> 将*标准输出*和*错误输出*合并*覆盖*重定向
&>> 将*标准输出*和*错误输出*合并*追加*重定向
command > /path/to/file 2> &1 将*标准输出*和*错误输出*合并*覆盖*重定向
command >> /path/to/file 2>> &1 将*标准输出*和*错误输出*合并*追加*重定向
set -c 禁止覆盖输出重定向
>| 强制覆盖
set +c 允许覆盖输出重定向
以上是关于I/O重定向详解的主要内容,如果未能解决你的问题,请参考以下文章