对于任何一个进程,在启动时,都会打开三个流: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等操作系统。

IO Redirect 与 Pipe的更多相关文章

  1. 控制台(Console)报错:java.io.IOException: Broken pipe

    控制台(Console)输出: java.io.IOException: Broken pipe at sun.nio.ch.FileDispatcherImpl.write0(Native Meth ...

  2. hive使用python脚本导致java.io.IOException: Broken pipe异常退出

    反垃圾rd那边有一个hql,在执行过程中出现错误退出,报java.io.IOException: Broken pipe异常,hql中使用到了python脚本,hql和python脚本最近没有人改过, ...

  3. POI 导入导出时异常[java.io.IOException: Broken pipe]

    使用用POI导出文件时抛出异常java.io.IOException: Broken pipe ERROR: 'java.io.IOException: Broken pipe' org.apache ...

  4. 线上问题!----------org.apache.catalina.connector.ClientAbortException: java.io.IOException: Broken pipe

    1.问题出现 昨晚项目在上线的时候因为推广的原因,新增的大量请求.在八点的时候. org.apache.catalina.connector.ClientAbortException: java.io ...

  5. 解决weblogic错误:java.sql.SQLRecoverableException: IO Error: Broken pipe

    首先说一下系统基础架构: 服务器:weblogic11g集群 数据库:oracle数据库Rac 出错信息: 1.java.sql.SQLRecoverableException: Closed Con ...

  6. openTSDB ConnectionManager: Unexpected exception from downstream java.io.IOException: Broken pipe

    openTSDB有这种错误: ConnectionManager: Unexpected exception from downstream for [id: 0xf85323a8, /10.65.3 ...

  7. java.io.IOException: Broken pipe

    最近项目虽然已经在正常运行,但是偶尔会有一些不知名的错误冒出来,比如时不时报一个数据库主键重复或者某些时候会有null的异常报出来.看看代码写完能跑起来还只是开始而已,需要不断精进重构,才能让代码运行 ...

  8. close connection error java.sql.SQLRecoverableException: IO Error: Broken pipe

    java.sql.SQLRecoverableException: IO Error: Broken pipe Table of Contents 1. 错误信息 2. 分析 2.1. 连接池 2.2 ...

  9. java.io.IOException 断开的管道 解决方法 ClientAbortException: java.io.IOException: Broken pipe

    今天公司技术支持的童鞋报告一个客户的服务不工作了,紧急求助,于是远程登陆上服务器排查问题. 查看采集数据的tomcat日志,习惯性的先翻到日志的最后去查看有没有异常的打印,果然发现了好几种异常信息,但 ...

随机推荐

  1. python字符串(string)方法整理

    python中字符串对象提供了很多方法来操作字符串,功能相当丰富. print(dir(str)) [..........'capitalize', 'casefold', 'center', 'co ...

  2. JavaScript 系列博客(二)

    JavaScript 系列博客(二) 前言 本篇博客介绍 js 中的运算符.条件语句.循环语句以及数组. 运算符 算术运算符 // + | - | * | / | % | ++ | -- consol ...

  3. OpenCV入门之获取验证码的单个字符(二)

      在文章 OpenCV入门之获取验证码的单个字符(字符切割)中,介绍了一类验证码的处理方法,该验证码如下: 该验证码的特点是字母之间的间隔较大,很容易就能提取出其中的单个字符.接下来,笔者将会介绍如 ...

  4. 【转载】PhpStudy修改网站根目录

    phpStudy是一个PHP调试环境的程序集成包.该程序包集成最新的Apache+PHP+MySQL+phpMyAdmin+ZendOptimizer,一次性安装,无须配置即可使用,是非常方便.好用的 ...

  5. Dapper批量更新

    本次示例项目使用Dappe1.50.5和Dapper.Contrib1.50.5 数据库执行的脚本检测工具是SQL Server Prifiler 1.使用Where In 实现批量更新 1.1代码如 ...

  6. 4.5 explain 之 ref

    一.说明 显示索引的哪一列被使用了,如果可能的话,是一个常数.哪些列或常量被用于查找索引上的值. 二.示例 a. b. c. 关注我的公众号,精彩内容不能错过

  7. js异步编程终级解决方案 async/await

      在最新的ES7(ES2017)中提出的前端异步特性:async.await. async.await是什么 async顾名思义是“异步”的意思,async用于声明一个函数是异步的.而await从字 ...

  8. python中的tcp

    目录 TCP简介 TCP介绍 TCP特点 TCP与UDP的不同点 udp通信模型 TCP通信模型 tcp客户端 tcp服务器 tcp注意点 TCP简介 TCP介绍 TCP协议,传输控制协议(英语:Tr ...

  9. Redirection

    Typically, the syntax of these characters is as follows, using < to redirect input, and > to r ...

  10. Python3 系列之 环境包管理神器 pipenv

    环境说明:Windows 10 build 17763 + Python 3.7.2 介绍 pipenv 是在 pip 与 virtualenv 基础上发展而来的,弥补了之前 virtualenv 通 ...