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等操作系统。

  • 相关阅读:
    LeetCode 40. 组合总和 II(Combination Sum II)
    LeetCode 129. 求根到叶子节点数字之和(Sum Root to Leaf Numbers)
    LeetCode 60. 第k个排列(Permutation Sequence)
    LeetCode 47. 全排列 II(Permutations II)
    LeetCode 46. 全排列(Permutations)
    LeetCode 93. 复原IP地址(Restore IP Addresses)
    LeetCode 98. 验证二叉搜索树(Validate Binary Search Tree)
    LeetCode 59. 螺旋矩阵 II(Spiral Matrix II)
    一重指针和二重指针
    指针的意义
  • 原文地址:https://www.cnblogs.com/f1194361820/p/9431026.html
Copyright © 2011-2022 走看看