linux子进程管道写入覆盖,Linux——标准I/O以及管道

标准I/O以及管道

目录

一、什么是I/O

二、什么是管道

三、三种I/O设备

四、把I/O输出错误重定向入文件

五、tr

六、从文件中导入STDIN

七、使用管道链接命令

八、tee

一、什么是I/O

I/O(input/output),即输入/输出端口。

每个设备都会有一个专用的I/O地址,用来处理自己的输入输出信息。CPU与外部设备、存储器的连接和数据交换都需要通过接口设备来实现,前者被称为I/O接口,而后者则被称为存储器        接口。存储器通常在CPU的同步控制下工作,接口电路比较简单;而I/O设备品种繁多,其相应的接口电路也各不相同,因此,习惯上说到接口只是指I/O接口。

二、什么是管道

管道是Linux支持的最初UnixIPC形式之一,管道和有名管道是最早的进程间通信机制之一,管道可用于具有亲缘关系进程间的通信,有名管道克服了管道没有名字的限制,因此,除具有        管道所具有的功能外,它还允许无亲缘关系进程间的通信。

具有以下特点:管道是半双工的,数据只能向一个方向流动;需要双方通信时,需要建立起两个管道;只能用于父子进程或者兄弟进程之间(具有亲缘关系的进程);单独构成一种独立        的文件系统:管道对于管道两端的进程而言,就是一个文件,但它不是普通的文件,它不属于某种文件系统,而是自立门户,单独构成一种文件系统,并且只存在与内存中。数据的读出        和写入:一个进程向管道中写的内容被管道另一端的进程读出。写入的内容每次都添加在管道缓冲区的末尾,并且每次都是从缓冲区的头部读出数据。

三、三种I/O设备

1、标准输入(STDIN)-0

输入设备:键盘、鼠标、麦克风、摄像头、扫描仪

2、标准输出(STDOUT)-1默认输出到终端窗口

输出设备:显示器、打印机、音响、耳机

3、标准错误(STDERR)-2默认输出到终端窗口

四、把I/O输出错误重定向入文件

1、STDOUT和STDERR可以被重定向到文件:

command  操作符号  file

2、支持的操作符号包括:

>    把STDOUT重定向到文件

2>   把STDERR重定向到文件

&>  把所有输出重定向到文件

3、> 文件内容会被覆盖

set -C: 禁止将内容覆盖已有文件,但可追加

>| file:强制覆盖

set +C: 允许覆盖

4、>> 原有内容基础上,追加内容

5、2>: 覆盖重定向错误输出数据流

6、2>>: 追加重定向错误输出数据流

7、 标准输出和错误输出各自定向至不同位置

COMMAND > /path/to/file.out2> /path/to/error.out

8、合并标准输出和错误输出为同一个数据流进行重定向

&>覆盖重定向

&>> 追加重定向

COMMAND > /path/to/file.out2>&1 (顺序很重要)

COMMAND >> /path/to/file.out2>&1

9、():合并多个程序的STDOUT

(cal2007;cal2008)> all.txt

五、tr

1、tr转换和删除字符

2、tr[OPTION]... SET1 [SET2]

3、选项:

-c–C --complement:取字符集的补集

-d--delete:删除所有属于第一字符集的字符

-s--squeeze-repeats:把连续重复的字符以单独一个字符表示

-t--truncate-set1:将第一个字符集对应字符转化为第二字符集对应的字符

4、通配符

[:alnum:]:字母和数字

[:alpha:]:字母

[:cntrl:]:控制(非打印)字符

[:digit:]:数字

[:graph:]:图形字符

[:lower:]:小写字母

[:print:]:可打印字符

[:punct:]:标点符号

[:space:]:空白字符

[:upper:]:大写字母

[:xdigit:]:十六进制字符

六、从文件中STDIN

1、使用

2、某些命令能够接受从文件中导入的STDIN

tr‘a-z’‘A-Z’

该命令会把/etc/issue中的小写字符都转换成写写字符

3、 tr–d abc< /etc/fstab删除fstab文件中的所有abc中任意字符

4、cat > file

mage

wangxiaochun

按ctrl+d离开,可以使用文件来代替键盘的输入

5、cat > filea< fileb

六、使用管道链接命令

1、管道(使用符号“|”表示)用来连接命令

命令1 | 命令2 | 命令3 | …

将命令1的STDOUT发送给命令2的STDIN,命令2的STDOUT发送到命令3的STDIN

STDERR默认不能通过管道转发,可利用2>&1 或|& 实现

最后一个命令会在当前shell进程的子shell进程中执行用来

组合多种工具的功能

ls | tr 'a-z' 'A-Z'

2、less :一页一页地查看输入

ls-l/etc|less

3、mail:通过电子邮件发送输入

echo"testemail"|mail-s "test"user@example.com

4、lpr:把输入发送给打印机

echo"testprint"|lpr-Pprinter_name

5、- 符号

示例:

将/home 里面的文件打包,但打包的数据不是记录到文件,而是传送到stdout,经过管道后,将tar -cvf-/home 传送给后面的tar -xvf-, 后面的这个-则是取前一个命令的stdout,  因此,就不需要使用临时file了

tar -cvf-/home | tar -xvf-

七、重定向到多个目标(tee)

1、命令1 | tee[-a ] 文件名| 命令2

把命令1的STDOUT保存在文件中,做为命令2的输入

-a 追加

2、使用:

保存不同阶段的输出

复杂管道的故障排除

同时查看和记录输出

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值