对于任何一个进程,在启动时,都会打开三个流: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. iOS UITextfield只允许输入数字和字母,长度限制

    -(BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementSt ...

  2. 异步加载图片以及Bitmap相关处理方法

    私类: // 异步更新Image private class GetImageTask extends AsyncTask<String, Void, Bitmap> { // 覆写的方法 ...

  3. C#与C++数据类型比较及结构体转换[整理]

    //c++:HANDLE(void   *)                          ----    c#:System.IntPtr//c++:Byte(unsigned   char)  ...

  4. surging+CentOS7+docker+rancher2.0 入门部署教程

    准备工作 开发环境  Visual Studio 2017 15.5 运行环境  虚拟机CentOS 7+Docker+Rancher 2.0+Consul+RabbmitMQ 项目下载地址  htt ...

  5. 【Tomcat】Tomcat相关设计模式分析

    门面模式 门面模式在 Tomcat 中有多处使用,在 Request 和 Response 对象封装中.Standard Wrapper 到 ServletConfig 封装中.Application ...

  6. Mybatis框架基础支持层——解析器模块(2)

    解析器模块,核心类XPathParser /** * 封装了用于xml解析的类XPath.Document和EntityResolver */ public class XPathParser { / ...

  7. No.3 数组中重复的数字 (P39)

    题目1:找出数组中重复的数字 [题目描述] 在一个长度为n的数组里的所有数字都在0到n-1的范围内. 数组中某些数字是重复的,但不知道有几个数字是重复的.也不知道每个数字重复几次.请找出数组中任意一个 ...

  8. Java反射的简单入门

    1.Class的简单介绍 Class类的类表示正在运行的Java应用程序中的类和接口. 枚举是一种类,一个注解是一种接口, 每个数组也属于一个反映为类对象的类,该对象由具有相同元素类型和维数的所有数组 ...

  9. lnmp环境切换php版本,并安装相应redis扩展

    ubuntu+nginx+mysql+php+redis,其中php装两个版本,php7和php56 1.让nginx支持不同站点可以选择不同的php版本 1>创建fastcgi.conf文件 ...

  10. 设置dataGridView单元格颜色、字体、ToolTip、字体颜色

    this.dataGridView3.Rows[e.RowIndex].Cells["你的那个要判断的列名"].Style.BackColor = Color.MediumPurp ...