zoukankan      html  css  js  c++  java
  • IO Redirect 与 Pipe

      对于任何一个进程,在启动时,都会打开三个流:stdin(标准输入), stdout(标准输出), stderr(标准错误输出)。Stdout,stderr是process与Display之间,stdin是process与keyboard之间。也就是说系统的标准输入输出,是进程与设备间交流的桥梁。

      但是在很多情况下,我们的程序数据并不来自于标准输入,我们在使用标准输出时,也不希望写到显示器上,可能是文件,网络,打印机等。这时候就需要IO Redirect来作用了。还有,为了方便使用等,我们希望将写到Stdout的数据作为另外一个进程的输入,其实这也是IO redirect的一种,不过它有个特殊的名字——pipe。

             

    1、IO Redirect

    1.1 File handle (File Description)

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

           这样一来,就可以直接使用0,1,2来表示Stdio了。

    在linux上使用lsof -p pid查看一个进程打开了哪些文件。下面是一个查看运行中的top命令的情况:

     

    1.2 基本的重定向操作符:>与<

      < 将标准输入(stdin, 0)重定向,也就是说数据来源不是键盘,而是其他,例如文件等。

      > 将标准输出(stdout, 1)重定向,也就是说数据不再写到显示器,而是其他地方。

      其中在 >,< 操作符的左边,只能是FD,右边可能是file,也可以是FD等。此外, <等价于 <1, >等价于1>,所以2> 就是将标准错误输出(stderr, 2)重定向。

      IO redirect的本质是什么呢?在我看来本质是FD的赋值。怎么理解呢?

      默认情况下一个,一个进程(例如:ls)是这样的:

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

    1.2.1 操作符右边是文件

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

    Ls 3>a :代表了fd3=a

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

    1.2.2 操作符右边是FD

    如果希望在多个FD之间进行赋值运算,那么就用>&或者<&。

    那么理解上还是 >时赋值运算符,&则是dup2系统调用了。

    2>&1的意思就是 对 FD1执行dup2,得到FD1的拷贝,然后赋值给FD2,也就是说FD1指向了谁,FD2也去指向谁。

    例如:

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

    需要注意的是:>本身不要求文件必须是存在的,但是经过了上述复制并赋值操作和后,启动进程之初就要准备好相应的流,此时就需要文件file.txt必须是存在的。

    1.3 变体操作符 >>

    如果将stdout或者stderr 重定向到一个文件,但文件里已经有内容,会是什么结果呢?使用 > file时,文件中已有的内容会被truncate掉,也就是文件内容被清除了。

    如果想要保留文件内容怎么办呢?

    有一个变体操作符:>> 以append的方式重定向。

    2、Pipe

           如果希望将输出内容,直接作为另外一个程序的输入,这种技术成为Pipe,能够进行Pipe的进程,必须是父子进程。用“|” 来表示管道。Pipe也是进程间通信的一种技术。

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

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

  • 相关阅读:
    用Less循环生成样式
    Angular Textarea 高度自动变化
    html文字溢出以省略号(...)替代
    mobiscroll之treelist使用
    安装Microsoft Visual C++ 2010 x64 Redistributable失败的解决方案
    获取input标签的所有属性
    checked
    js中的in-for循环
    checkbox批量选中,获取选中的项的值
    vue 订单列表 多个倒计时
  • 原文地址:https://www.cnblogs.com/f1194361820/p/9431026.html
Copyright © 2011-2022 走看看