IO Redirect 与 Pipe

  对于别的二个经过,在运营时,都会打开八个流:stdin(标准输入),
stdout(标准输出),
stderr(标准错误输出)。Stdout,stderr是process与Display之间,stdin是process与keyboard之间。也便是说系统的正经输入输出,是进度与设备间沟通的大桥。

  可是在重重场馆下,大家的顺序数据并不出自姜伟规输入,大家在运用标准输出时,也不期待写到显示屏上,大概是文本,网络,打字与印刷机等。那时候就须要IO
Redirect来作用了。还有,为了方便使用等,大家盼望将写到Stdout的数量作为其它多少个进度的输入,其实这也是IO
redirect的壹种,然则它有个优良的名字——pipe。

 

   ca88官网 1 
    

 

1、IO Redirect

1.1 File handle (File Description)

       操作系统内核会为每一个进程分配很多file handler(也叫 File
Description),个中始发时会分配3个handle,用数字0,壹,二来表示,分别分配给了stdin,
stdout, stderr。别的的则是随着须求分配的。

       那样一来,就能够直接使用0,1,贰来代表Stdio了。

 

在linux上使用lsof -p
pid查看三个进度打开了何等文件。下面是3个查看运转中的top命令的情事:

 ca88官网 2

 

 

一.二 基本的重定向操作符:>与<

  < 将标准输入(stdin,
0)重定向,相当于说数据出自不是键盘,而是此外,例如文件等。

  > 将行业内部输出(stdout,
1)重定向,相当于说数据不再写到显示器,而是此外省方。

  在那之中在 >,<
操作符的左手,只可以是FD,左侧可能是file,也足以是FD等。别的, <等价于
<壹, >等价于1>,所以二> 就是将规范错误输出(stderr, 贰)重定向。

 

  IO redirect的五指山真面目是如何吧?在笔者眼里本质是FD的赋值。怎么精通吧?

  默许情形下二个,二个经过(例如:ls)是如此的:

 

对于一个进程而言:
#0 = keyboard
#1 = display
#2 = display

 

壹.②.1 操作符右侧是文本

ls >a:代表了 fd1=a
#0 = keyboard
#1 = a
#2 = display

Ls 3>a :代表了fd3=a

sort<file.txt :代表了fd0=file.txt

 

1.二.2 操作符左边是FD

假若期望在两个FD之间举办赋值运算,那么就用>&只怕<&。

那么明亮上也许 >时赋值运算符,&则是dup二系统调用了。

二>&1的意趣就是 对
FD1执行dup②,获得FD一的正片,然后赋值给FD二,也正是说FD1指向了哪个人,FD2也去指向何人。

 

例如:

3>file.txt 2>&3 代表了:FD3–>file.txt,那么FD2—>file.txt

急需小心的是:>自身不需要文件必须是存在的,可是透过了上述复制并赋值操作和后,运营进程之初就要预备好相应的流,此时就内需文件file.txt必须是存在的。

 

 

一.叁 变体操作符 >>

 

设若将stdout或然stderr
重定向到一个文本,但文件里早就有内容,会是何等结果吗?使用 >
file时,文件中已有个别内容会被truncate掉,也正是文件内容被铲除了。

假诺想要保留文件内容怎么做呢?

有2个变体操作符:>> 以append的主意重定向。

 

 

2、Pipe

      
若是期望将出口内容,直接当做其余一个主次的输入,那种技能成为Pipe,能够实行Pipe的历程,必须是父亲和儿子进度。用“|”
来代表管道。Pipe也是进程间通讯的一种技术。

诸如:lsof -p pid | grep xxx ,父进度是 lsof, 子进程是grep。

 

本篇内容适用于 Windows,Linux,Unix等操作系统。

 

相关文章