当前位置:文档之家› 管道与重定向

管道与重定向

管道与重定向
管道与重定向

管道命令操作符是:”|”,它仅能处理经由前面一个指令传出的正确输出信息,也就是standard output 的信息,对于stdandard

error 信息没有直接处理能力。然后,传递给下一个命令,作为标准的输入standard input.

先看下下面图:

command1正确输出,作为command2的输入然后comand2的输出作为,comand3的输入,comand3输出就会直接显示在屏幕上面了。

通过管道之后:comand1,comand2的正确输出不显示在屏幕上面

注意:

1、管道命令只处理前一个命令正确输出,不处理错误输出

2、管道命令右边命令,必须能够接收标准输入流命令才行。

实例:

[chengmo@centos5 shell]$ cat test.sh | grep -n 'echo'

5: echo "very good!";

7: echo "good!";

9: echo "pass!";

11: echo "no pass!";

#读出test.sh文件内容,通过管道转发给grep 作为输入内容

[chengmo@centos5 shell]$ cat test.sh test1.sh | grep -n 'echo'

cat: test1.sh: 没有那个文件或目录

5: echo "very good!";

7: echo "good!";

9: echo "pass!";

11: echo "no pass!";

#cat test1.sh不存在,错误输出打印到屏幕,正确输出通过管道发送给grep

[chengmo@centos5 shell]$ cat test.sh test1.sh 2>/dev/null | grep -n 'echo'

5: echo "very good!";

7: echo "good!";

9: echo "pass!";

11: echo "no pass!";

#将test1.sh 没有找到错误输出重定向输出给/dev/null 文件,正确输出通过管道发送给grep

[chengmo@centos5 shell]$ cat test.sh | ls

catfile httprequest.txt secure test testfdread.sh testpipe.sh testsh.sh

testwhile2.sh

envcron.txt python sh testcase.sh testfor2.sh testselect.sh test.txt text.txt env.txt release sms testcronenv.sh testfor.sh test.sh testwhile1.sh

#读取test.sh内容,通过管道发送给ls命令,由于ls 不支持标准输入,因此数据被丢弃

这里实例就是对上面2点注意的验证。作用接收标准输入的命令才可以用作管道右边。否则传递过程中数据会抛弃。常用来作为接收数据管道命令有:sed,awk,cut,head,top,less,more,wc,join,sort,split 等等,都是些文本处理命令。

管道命令与重定向区别

区别是:

1、左边的命令应该有标准输出| 右边的命令应该接受标准输入

左边的命令应该有标准输出> 右边只能是文件

左边的命令应该需要标准输入< 右边只能是文件

2、管道触发两个子进程执行"|"两边的程序;而重定向是在一个进程内执行

这些都是网上总结很多的,其实只要多加清楚用法,也一定有自己的一份不同描述。

实例:

#可以相互转换情况

#输入重定向

[chengmo@centos5 shell]$ cat test.sh| grep -n 'echo'

5: echo "very good!";

7: echo "good!";

9: echo "pass!";

11: echo "no pass!";

#"|"管道两边都必须是shell命令

[chengmo@centos5 shell]$ grep -n 'echo'

5: echo "very good!";

7: echo "good!";

9: echo "pass!";

11: echo "no pass!";

#"重定向"符号,右边只能是文件(普通文件,文件描述符,文件设备)

[chengmo@centos5 shell]$ mail -s 'test' 8292669@https://www.doczj.com/doc/0b6402999.html,

[chengmo@centos5 shell]$ cat test.sh|mail -s 'test' 8292669@https://www.doczj.com/doc/0b6402999.html,

#以上2个也相同,将test.sh内容发送到指定邮箱。

[chengmo@centos5 shell]$ (sed -n '1,$p'|grep -n 'echo')

5: echo "very good!";

7: echo "good!";

9: echo "pass!";

11: echo "no pass!";

#这个脚本比较有意思了。由于前面是管道,后面需要把test.sh内容重定向到 sed ,然后sed输出通过管道,输入给grep.需要将前面用"()"运算符括起来。在单括号内的命令,可以把它们看作一个象一个命令样。如果不加括号test.sh就是grep 的输入了。

#上面一个等同于这个

[chengmo@centos5 shell]$ sed -n '1,$p'

5: echo "very good!";

7: echo "good!";

9: echo "pass!";

11: echo "no pass!";

#重定向运算符,在shell命令解析前,首先检查的(一个命令,执行前一定检查好它的输入,输出,也就是0,1,2 设备是否准备好),所以优先级会最高

[chengmo@centos5 shell]$ sed -n '1,10p'

10:echo $total;

18:echo $total;

21: echo "ok";

#哈哈,这个grep又接受管道输入,又有testsh.sh输入,那是不是2个都接收呢。刚才说了"<"运算符会优先,管道还没有发送数据前,grep绑定了testsh.sh输入,这样sed命令输出就被抛弃了。这里一定要小心使用

#输出重定向

[chengmo@centos5 shell]$ cat test.sh>test.txt

[chengmo@centos5 shell] cat test.sh|tee test.txt &>/dev/null

#通过管道实现将结果存入文件,还需要借助命令tee,它会把管道过来标准输入写入文件test.txt ,然后将标准输入复制到标准输出(stdout),所以重定向到/dev/null 不显示输出

#">"输出重定向,往往在命令最右边,接收左边命令的,输出结果,重定向到指定文件。也可以用到命令中间。

[chengmo@centos5 shell]$ ls test.sh test1.sh testsh.sh 2>err.txt | grep 'test'

test.sh

testsh.sh

#目录下面有:test,testsh文件,test1.sh不存在,因此将ls 命令错误输出输入到err.txt 正确输出,还会通过管道发送到grep命令。

[chengmo@centos5 shell]$ ls test.sh test1.sh testsh.sh &>err.txt | grep 'test'

#这次打印结果是空,&代表正确与错误输出都输入给err.txt,通过管道继续往下面传递数据为空,所以没有什么显示的

#同样">"输出重定向符,优先级也是先解析,当一个命令有这个字符,它就会与左边命令标准输出绑定。准备好了这些,就等待命令执行输出数据,它就开始接收

再概括下:

从上面例子可以看,重定向与管道在使用时候很多时候可以通用,其实,在shell里面,经常是【条条大路通罗马】的。一般如果是命令间传递参数,还是管道的好,如果处理输出结果需要重定向到文件,还是用重定向输出比较好。

命令执行顺序可以看下:Linux Shell 通配符、元字符、转义符使用实例介绍

shell脚本接收管道输入

有意思的问题:

既然作用管道接收命令,需要可以接收标准的输入,那么我们shell脚本是否可以开发出这样的基本程序呢?(大家经常看到的,都是一些系统的命令作为管道接收方)

实例(testpipe.sh):

#!/bin/sh

if [ $# -gt 0 ];then

exec 0<$1;

#判断是否传入参数:文件名,如果传入,将该文件绑定到标准输入

fi

while read line

do

echo $line;

done<&0;

#通过标准输入循环读取内容

exec 0&-;

#解除标准输入绑定

运行结果:

[chengmo@centos5 shell]$ cat testpipe.txt

1,t,est pipe

2,t,est pipe

3,t,est pipe

4,t,est pipe

#testpipe.txt 只是需要读取的测试文本

[chengmo@centos5 shell]$ cat testpipe.txt | sh testpipe.sh

1,t,est pipe

2,t,est pipe

3,t,est pipe

4,t,est pipe

#通过cat 读取 testpipe.txt 发送给testpipe.sh 标准输入

[chengmo@centos5 shell]$ sh testpipe.sh testpipe.txt

1,t,est pipe

2,t,est pipe

3,t,est pipe

4,t,est pipe

#testpipe.sh 通过出入文件名读取文件内容

管道与重定向

管道命令操作符是:”|”,它仅能处理经由前面一个指令传出的正确输出信息,也就是standard output 的信息,对于stdandard error 信息没有直接处理能力。然后,传递给下一个命令,作为标准的输入standard input. 先看下下面图: command1正确输出,作为command2的输入然后comand2的输出作为,comand3的输入,comand3输出就会直接显示在屏幕上面了。 通过管道之后:comand1,comand2的正确输出不显示在屏幕上面 注意: 1、管道命令只处理前一个命令正确输出,不处理错误输出 2、管道命令右边命令,必须能够接收标准输入流命令才行。 实例: [chengmo@centos5 shell]$ cat test.sh | grep -n 'echo' 5: echo "very good!"; 7: echo "good!"; 9: echo "pass!"; 11: echo "no pass!"; #读出test.sh文件内容,通过管道转发给grep 作为输入内容 [chengmo@centos5 shell]$ cat test.sh test1.sh | grep -n 'echo' cat: test1.sh: 没有那个文件或目录 5: echo "very good!"; 7: echo "good!"; 9: echo "pass!"; 11: echo "no pass!"; #cat test1.sh不存在,错误输出打印到屏幕,正确输出通过管道发送给grep [chengmo@centos5 shell]$ cat test.sh test1.sh 2>/dev/null | grep -n 'echo' 5: echo "very good!"; 7: echo "good!"; 9: echo "pass!"; 11: echo "no pass!"; #将test1.sh 没有找到错误输出重定向输出给/dev/null 文件,正确输出通过管道发送给grep [chengmo@centos5 shell]$ cat test.sh | ls catfile httprequest.txt secure test testfdread.sh testpipe.sh testsh.sh testwhile2.sh envcron.txt python sh testcase.sh testfor2.sh testselect.sh test.txt text.txt env.txt release sms testcronenv.sh testfor.sh test.sh testwhile1.sh #读取test.sh内容,通过管道发送给ls命令,由于ls 不支持标准输入,因此数据被丢弃 这里实例就是对上面2点注意的验证。作用接收标准输入的命令才可以用作管道右边。否则传递过程中数据会抛弃。常用来作为接收数据管道命令有:sed,awk,cut,head,top,less,more,wc,join,sort,split 等等,都是些文本处理命令。 管道命令与重定向区别 区别是: 1、左边的命令应该有标准输出| 右边的命令应该接受标准输入 左边的命令应该有标准输出> 右边只能是文件 左边的命令应该需要标准输入< 右边只能是文件

Windows进程内标准输出重定向

Windows进程内标准输出重定向及其在程序调试上的应用 一、如何实现 打印调试信息的方法有很多,最常用的是使用标准输出设备(如printf、cout等),也可以用OutPutDebugString输出、用DebugView工具查看,还可以写入日志文件。如果程序运行需要记录日志(log),往往需要打开个文件,或许是写入系统事件、用系统的事件查看器查看。 应用程序打印调试信息、日志的方法往往是确定的,但如果是要编写一个模块或者说组件,那样的输出信息应该写入哪里呢?或者说程序本身对此也没有明确需求的话,那该怎么办呢? 可喜的是一个进程的标准输出是可以重定向的,所以我建议把调试信息直接打到标准输出上,这样代码中可以统一使用cout或者printf,然后根据需要将标准输出重定向。 Linux中重定向标准输出就容易了,因为有强大的dup2函数。而对于Windows的重定向,貌似往往是用于子进程的,在用CreateProcess创建子进程时设置子进程的标准输出句柄。而我们想要的是重定向自己这个进程的标准输出,那个用不上。我在MSDN中也没找到类似dup2的Win32 API函数,只有一个DuplicateHandle函数,这相当于linux中的dup,也用不上。 这里顺便提下,SetStdHandle是不能实现重定向的。这个函数的功能是将某句柄指向标准设备,并不能将标准设备句柄重定向到另外的句柄。 于是我就想到,Windows不是支持一部分POSIX标准的吗。于是我找到了一个CRT的函数,叫_dup2,看起来是不是特眼熟,对了,这就是Windows中dup2的兼容版本。 值得注意的是,_dup2以及与此相关的一系列CRT中的IO函数(如_read,_write)均以下划线开头,其余与linux大致相同,其参数中所谓的文件描述符与Win32中的句柄不一样,文件描述符实际上是句柄数组的索引,也就是说文件描述符不能与句柄混用。比如0,1,2分别是标准输入、标准输出、标准错误的文件描述符,但句柄值不是这样确定的。文件描述符不是Win32的概念,是POSIX中的概念。 _dup2用法与dup2大致相同,不多解释,不了解的可以查阅dup2相关资料。下面讲点应用。 二、如何应用于调试 写一个模块时,我们可以直接用cout/printf来作调试。但是如果这个模块用于图形界面或许是系统服务呢?这时标准输出看不到了,我们可以用OutPutDebugString函数和DebugView 这样的调试工具。这样就带来一种选择,而选择往往是增加软件复杂度的因素。所以我的想法是代码中只用cout/printf,如果需要将其重定向到调试工具中去。 如何实现呢,用匿名管道和线程。 用一个pipe,标准输出重定向到其write端,然后创建一个线程,线程要做的就是从pipe的

Linux输入输出重定向的原理和实现

Linux I/O重定向的原理和实现 在Unix系统中,每个进程都有STDIN、STDOUT和STDERR这3种标准I/O,它们是程序最通用的输入输出方式。几乎所有语言都有相应的标准I/O函数,比如,C语言可以通过scanf从终端输入字符,通过printf向终端输出字符。熟悉Shell的朋友都知道,我们可以方便地对Shell命令进行I/O重定向,比如find -name "*.java" >testfile.txt 把当前目录下的Java文件列表重定向到testfile.txt。多数情况下,我们只需要了解I/O重定向的使用就够了,但是如果要编程实现类似Shell的I/O重定向以及管道功能,那么就需要清楚它的原理和实现。 下面本文就以Linux系统为具体例子,介绍I/O重定向的原理和实现(文中实验环境为Ubuntu 12.04,内核版本3.2.0-59)。 文件描述符表 理解I/O重定向的原理需要从Linux内核为进程所维护的关键数据结构入手。对Linux 进程来讲,每个打开的文件都是通过文件描述符(File Descriptor)来标识的,内核为每个进程维护了一个文件描述符表,这个表以FD为索引,再进一步指向文件的详细信息。在进程创建时,内核为进程默认创建了0、1、2三个特殊的FD,这就是STDIN、STDOUT和STDERR,如下图所示意: 所谓的I/O重定向也就是让已创建的FD指向其他文件。比如,下面是对STDOUT重定向到testfile.txt前后内核文件描述符表变化的示意图 重定向前:

重定向后: 在I/O重定向的过程中,不变的是FD 0/1/2代表STDIN/STDOUT/STDERR,变化的是文件描述符表中FD 0/1/2对应的具体文件,应用程序只关心前者。本质上这和接口的原理是相通的,通过一个间接层把功能的使用者和提供者解耦。 下面我们通过strace命令跟踪一下echo命令的系统调用: dagang@ubuntu12:~$ strace echo hello 2>&1 >/dev/null | grep write write(1, "hello\n", 6) = 6 我们可以看到write(1, "hello\n", 6) 这样一个系统调用,它的第一个参数1就是代表的STDOUT的FD,这说明对于echo程序,它只管(通过标准I/O函数从STDOUT)向FD 1写入,而不关心它们FD 1到底对应的是哪个文件。 Shell正是通过I/O重定向和管道这种特殊的文件把多个程序的STDIN和STDOUT串联在一起组成更复杂功能的,下面是Shell中通过管道的示意图: 下面我们用一个实际的例子来体验一下: dagang@ubuntu12:~$ sleep 30 | sleep 40 & [1] 5584 dagang@ubuntu12:~$ pgrep -l sleep 5583 sleep 5584 sleep dagang@ubuntu12:~$ ll /proc/5583/fd total 0 lrwx------ 1 dagang dagang 64 Feb 27 13:41 0 -> /dev/pts/3 l-wx------ 1 dagang dagang 64 Feb 27 13:41 1 -> pipe:[246469] lrwx------ 1 dagang dagang 64 Feb 27 13:41 2 -> /dev/pts/3 dagang@ubuntu12:~$ ll /proc/5584/fd

Linux重定向和管道(精)

6.3 Linux重定向和管道 实验目的 通过重定向和管道操作: 1) 熟悉输入/输出(I/O) 重定向; 2) 把标准输出重定向创建一个文件; 3) 防止使用重定向的时候覆盖文件; 4) 把输出追加到一个现有的文件中; 5) 把一个命令的输出导入到另一个命令中。 实验内容与步骤 在本实验中将会用到下列命令: pwd:显示当前的工作路径。 cd:改变目录路径。 ls:显示指定目录的内容。 more:分页显示文件的内容。这是用于显示文本文件的首选方法。 head:截取显示文件的开头部分(默认为开头10行) 。 tail:截取显示文件的结尾部分(默认为最后10行) 。 cal:有关日历的命令。 set:当前shell下定义的一系列变量及其值。 echo:显示变量的值。 ps:显示当前进程的信息。 data:显示或设置系统日期和时间。 grep:查找文件中指定的关键字的行并输出。 步骤1:开机,登录进入GNOME。 在GNOME登录框中填写指导老师分配的用户名和口令并登录。 步骤2:访问命令行。 单击红帽子,在“GNOME帮助”菜单中单击“系统工具”-“终端”命令,打开终端窗口。 1. 使用重定向标准输出符号 步骤3:重定向标准输出,创建一个文件。 右尖括号或称大于符号(>) 把命令的输出发送到一个文件中:使用单个右尖括号,当指定文件名不存在的时候,将创建一个新文件;如果文件名存在,它将

被覆盖。(注意:命令、重定向符号和文件名之间的空格是可选的) 。 重定向标准输出命令的格式是: command > file 1) 为核实当前所在目录位置,使用什么命令? ___pwd________________________________________________________ 如果当前位置不在主目录中,使用什么命令可以改变到主目录中? ___cd /__________________________________________________________ 2) 如果希望把文件和目录列表截获,存储为主目录中的一个文件,这样可以追踪主目录中有什么文件。使用什么命令,把长文件列表的输出重定向,创建一个叫做homedir.list的文件。 ____ls >homedir.list________________________________________________ 3) 新文件homedir.list被放在哪里? __根目录_________________________________________________________ 使用ls命令核实新文件存在。 4) 使用什么命令,以一次一屏的方式,来查看刚才创建的文件内容? __ls –l|more homedir.list____________________________________________ 5) 使用head命令截获homedir.list文件的前10行,通过重定向,创建一个叫做dhomedir.list-top-10的新文件。应该使用什么命令? ___head –10 homedir.list >dhomedir.list-tail-10_________________________ 使用more命令查看文件的内容。 6) 使用tail命令,截获homedir.list文件的最后10行,通过重定向,创建一个叫做dhomedir.list-top-10的新文件。使用什么命令? ___tail –10 homedir.list >dhomedir.list-top-10___________________________ 使用more命令查看文件的内容。 7) 截获cal -y命令的输出,把它存到名为calendar的文件中。查看文件的内容。截获了什么? ___cal –y>calendar |more calendar 截获了2008年12个月份的日历 8) 截获cal 2010命令的输出,把它存到名为calendar的文件中。查看文件的内容。其中有什么内容? _ cal -y 2010 > calendar |more calendar 2010年12月份的日历 日历有什么变化? ____不是2008年,变成2010年了_____________________________________ 步骤4:防止使用重定向的时候覆盖文件。 在bash shell中,一个叫做noclobber的选项可以用来设定防止在重定向的过程中覆盖文件。可以在命令行中使用$set -o noclobber命令来完成。o代表选项。 为了重新激活clobber特性,使用$set -o noclobber;撤消则用set +o noclobber。 如果你使用的是csh shell,为了激活/撤消C shell中的clobber特性,使用set noclobber和unset noclobber。 1) 输入命令,打开shell中的noclobber选项。输入什么命令? ___set –o noclobber__________________________________________ _____ 2) 输入命令ls -l > homedir.list,结果是什么? ___bash:homedir.list:cannot overwrite existing file.因为clobber选项防止了重定向过程覆盖文件___________________________________ _ _

linux管道学习笔记

声明:本文档所有内容均为网上整理所得,不保证所有内容正确性.版权属作者本人所有。不用做任何商业用途,仅供广大网友学习交流之用,如有侵权,请联系本人删除,若发现文档中内容有错误或者有个人见解,欢迎指教与相互讨论.Email:.weiming999@https://www.doczj.com/doc/0b6402999.html,。 管道 无名管道 管道包括无名管道和有名管道两种,前者在父子进程中流行,后者由于可以独立成为磁盘文件而存在,因为能够被无血缘关系的进程共享. 无名管道通常直接称为管道,它占用两个文件描述符,不能被非血缘关系的进程共享,一般应用于父子进程. UNIX中一切皆为文件,管道也是一种文件,称为管道文件.当系统中创建一个管道时,它返回两个文件描述符:一个文件以只写打开,作为管道的输入端;另一个文件以只读打开,作为管道的输出端. #include int pipe(int fildes[2]); 函数pipe在内核中创建一个管道,并分配两个文件描述符标识管道的两端,这两个文件描述符存储与fildes[0]和fildes[1]中.一般约定fildes[0]描述管道和输出端,进程向此文件描述符中读取数据,fildes[1]描述管道的输入端,进程向此文件描述符写入数据. fildes[0]:只读文件描述符. fildes[1]:只写文件描述符. Pipe调用成功返回0,否则返回-1. 单向管道流模型 管道的两端(输入端和输出端)被一个进程控制没有太大的意义,如果管道的两端分别控制在不同的进程中,这两个进程之间就能够进行通信.拥有管道输入端的进程,可以向管道发送数据,拥有管道输出端的进程,可以从管道中接受前一个进程发送来的消息. 1)从父进程流向子进程的管道 在父进程创建无名管道并产生子进程后,父子进程均拥有管道两端的访问权.此时关闭父进程的管道输出端,关闭子进程的管道输入端,就形成一个从父进程到子进程的管道流,数据由父进程写入,从子进程读出. 2)从子进程流向父进程的管道 在父进程中创建无名管道并产生子进程后,父子进程均拥有两端的访问权.此时关闭父进程的管道输入端,关闭子进程的管道输出端,就形成了一个从子进程到父进程的管道流.数据由子进程写入,从父进程读出. #i n c l u d e

Linux管道、重定向及多命令

管道和重定向 多命令协作就是通过管道和重定向机制完成的 1.命令行shell的数据流定义 2.重定向 >将STDOUT重定向到文件(覆盖) andy@Fred:~/fred$ echo "abcd" > dddd andy@Fred:~/fred$ ls a abc b b cc c dddd andy@Fred:~/fred$ cat dddd abcd andy@Fred:~/fred$ ls -l 总用量12 -rw-r--r-- 1 andy andy 0 1月 3 21:43 a drwxr-xr-x 2 andy andy 4096 1月 5 10:47 abc -rw-r--r-- 1 andy andy 0 1月 3 21:43 bb -rw-r--r-- 1 andy andy 24 1月 3 21:43 ccc -rw-r--r-- 1 andy andy 5 1月7 21:33 dddd andy@Fred:~/fred$ ls -l > ddd andy@Fred:~/fred$ cat ddd 总用量12 -rw-r--r-- 1 andy andy 0 1月 3 21:43 a drwxr-xr-x 2 andy andy 4096 1月 5 10:47 abc -rw-r--r-- 1 andy andy 0 1月 3 21:43 bb -rw-r--r-- 1 andy andy 24 1月 3 21:43 ccc -rw-r--r-- 1 andy andy 0 1月7 21:35 ddd -rw-r--r-- 1 andy andy 5 1月7 21:33 dddd >>将STDOUT重定向到文件(追加到最后,另起一行) 错误信息是不能添加进入的 2>是将错误信息进行添加,但是正确是信息是不会写入。

管道的一些实例代码

/*管道 可以把管道想象为两个实体之间的单向连接器。注意,管道是半双工的, 如果需要全双工通讯,应该转而考虑套接字。 匿名管道又称管道,提供了一个进程与它的兄弟进程通讯的方法,只存在于父进程中;命名管道,可以存在与文件系统中,任意进程都可找到它,使得不同先祖的进程也可以通讯。 #include int pipe( int dfs[ 2 ] );创建匿名管道 int dup(int oldfd );创建一个文件描述符的副本 int dup2(int oldfd, int targetfd); dup/dup2提供了复制文件描述符的功能。他们常用于stdin(0)、stdout(1)、stderr(2)的重定向; #include #include int mkfifo(const char* pathname,mode_t mode );创建一个命名管道 记住:管道只不过是一对文件描述符因此所有能够操作文件描述符的函数都可用于管道。这些函数 包括但不限于select,read,write,fcntl,freopen。 */ /**********1、简单匿名管道应用************/ #include #include #include #define MAX_LINE 80 #define PIPE_STDIN 0 #define PIPE_STDOUT 1 /* myPipe[ 1 ]向管道写入数据;myPipe[ 0 ]从管道读取数据。 */ int main( ) { const char* string={"A simple message."}; int ret,myPipe[ 2 ]; char buffer[ MAX_LINE+1 ]; //create the pipe ret=pipe( myPipe ); //pipe( )创建一个匿名管道 if( ret==0 ) { //write the message into the pipe write( myPipe[ PIPE_STDOUT ],string,strlen( string ) ); //read the message from the pipe ret=read( myPipe[ PIPE_STDIN ],buffer,MAX_LINE ); //NULL terminate the string buffer[ ret ]=0;

父子进程通过管道通信(MFC重定向)

今天领导心血来潮说服务器的运行界面是一个黑乎乎的控制台,太低端了,看我们能不能把它图形化,至少做成一个窗口有按钮点启动、停止。好吧,领导拍脑袋就叫人干活的事不少,也没有产品规划,也就是让他看的舒服,只能去做了。 其中有一个关键性问题,就是原先是往控制台输出的信息,使用mfc图形化之后该往哪输出,工程维护人员肯定还是希望能在图形界面上能够看到这些信息的,因此就涉及到了如何获取到输出控制台的消息(都是cout、printf这种标准输出),然后再将这些消息重写到view上。这时候想到了标准输出重定向,因此整理了下思路: 1.将标准输出重定向到管道 2.创建一个线程从管道里取出数据 3.在view的OnPaint中将数据显示出来 二、实现 1.创建管道 [cpp]view plaincopyprint? 1.BOOL bRet = CreatePipe(&hRead, &hWrite, NULL, 0); // 创建匿名管道 2.if (bRet != TRUE) 3. printf("创建匿名管道失败,错误代码:%d\n", GetLastError()); 2.将标准输出重定向到管道的写句柄中 [cpp]view plaincopyprint? 1.int nOpenHandle = _open_osfhandle((intptr_t)hWrite, _O_TEXT); 2.FILE* fp = _fdopen( nOpenHandle, "w"); 3.*stdout = *fp; 注意:这里不能使用SetStdHandle(STD_OUTPUT_HANDLE, hWrite),在MFC中SetStdHandle是没有效果的。 3.创建线程从管道取数据 [cpp]view plaincopyprint? 1.boost::thread thr(boost::bind(&CKDSShellView::print_cb, this));

Linux下管道命令及应用

利用输入/输出重定向 在Linux命令行模式中,如果命令所需的输出不是来自键盘,而是来自指定的文件,这就是输入重定向。同理,命令的输出也可以不显示在屏幕上,而是写入到指定文件中,这就是输出重定向。 接下来看看标准输入/输出重定向在构造一条Linux命令中的实际应用。 1.输入重定向和输出重定向 # wc home.txt 第一条命令将文件aa.txt作为wc命令的输入,统计出aa.txt的行数、单词数和字符数。第二条命令将ls命令的输出保存在一个名为home.txt的文件中。如果符号后边的文件已存在,那么这个文件将被重写。 2.同时使用输入和输出重定向 # iconv -f gb18030 -t utf-8 new-aa.txt 这条命令里同时用到了输入重定向(new-aa.txt)。aa.txt实际是一个gb18030编码的文件,而new-aa.txt则是将aa.txt的内容转换成utf-8格式的新文件。 利用管道 利用Linux所提供的管道符“|”将两个命令隔开,管道符左边命令的输出就会作为管道符右边命令的输入。连续使用管道意味着第一个命令的输出会作为第二个命令的输入,第二个命令的输出又会作为第三个命令的输入,依此类推。下面来看看管道是如何在构造一条Linux命令中得到应用的。 1.利用一个管道 # rpm -qa|grep licq 这条命令使用一个管道符“|”建立了一个管道。管道将rpm -qa命令的输出(包括系统中所有安装的RPM包)作为grep命令的输入,从而列出带有licq字符的RPM包来。 4.利用多个管道 # cat /etc/passwd | grep /bin/bash | wc -l 这条命令使用了两个管道,利用第一个管道将cat命令(显示passwd文件的内容)的输出送给grep命令,grep命令找出含有“/bin/bash”的所有行;第二个管道将grep的输入送给wc命令,wc命令统计出输入中的行数。这个命令的功能在于找出系统中有多少个用户使用bash。 利用命令替换 在Linux命令行模式下,当遇到一对“`”(上分割符)时,将首先执行“`”中间包含的命令,然后将其输出结果作为参数代入命令行中,这就是命令替换了。它类似于输入输出的重定向功能,但区别在于命令替换是将一个命令的输出作为另外一个命令的参数。下面来看它的实际应用。 1.使用命令替换 # touch `date +%Y%m%d%k%M%S`.txt 该命令使用了一次命令替换,date +%Y%m%d%k%M%S命令将首先执行,它将按指定格式输出当前的时间。然后,这个时间将被作为touch命令的参数,其结果是建立了一个以当前时间为文件名的文件。 2.使用命令替换 # kill `/sbin/pidof smbd` 该命令将杀掉sshd的所有进程。这里用pidof这个命令给出进程号,因为kill是针对进程号进行操作的。两者通过命令替换,实现了只用一条命令就杀掉sshd所有进程的功能。

linux输入输出重定向以及管道(精)

输入/输出重定向,管道 1、标准输入:/dev/stdin(键盘),描述符号是0 2、标准输出:/dev/stdout(屏幕),描述符号是1 3、错误输出:/dev/stderr(错误消息输出到屏幕上),描述符号是2 COMMAND_OUTPUT > OUTPUT_FILENAME #重定向stdout到一个文件 #如果没有这个文件就创建一个,否则就覆盖原文件里面的内容 :> OUTPUTFILENAME #如果文件没有,就创建一个0长度的文件(==touch) #:是一个占位符,不产生任何输出 #>会把文件“FILENAME”截断为0长度 > FILENAME #>会把文件“FILENAME”截断为0长度 #如果文件没有,就创建一个0长度的文件(==touch) #(与上面的“:>”效果相同,但是在某些shell下可能不能工作)如图所示

COMMAND [options] > file.list #创建一个包含目录树列表的文件 如图所示: COMMAND_OUTPUT >> OUTPUT_FILENAME #重定向stdout到一个文件 #如果没有这个文件就创建一个,否则就追加到文件后边如图所示: 1>filename #重定向stdout到文件filename中

1>>filename #重定向并且追加stadout到文件filename中如图所示 2>filaname #重定向stderr到文件filename中 2>>filename #重定向并且追加staderr到文件filename中如图所示

&>filename #把stdout和stderr都重定向到文件filename中 如图所示 2>&1 #重定向stderr到stdout #得到的错误的消息与stdout一样,发送到一个地方如图所示: i>&j #重定向文件描述符i到j中 #指向i文件的所有的输出都发送到j中去 >&j #默认的重定向文件描述符1 #所有传递到stdout的传输都送到j中去

实验八 LinuxC编程 IO重定向和管道

实验八Linux/C编程I/O重定向和管道 实验目的 使写生进一步理解I/O重定向和管道的原理和编程方法 实验内容 要求学生掌握以下内容 (1)I/O重定向编程 (2)管道编程 实验步骤 1. I/O重定向 (1)运用open-close-open方法 //demo1.c #include #include main(){ int fd ; char l ine[100]; fgets( line, 100, stdin ); printf("%s", line ); fgets( line, 100, stdin ); printf("%s", line ); fgets( line, 100, stdin ); printf("%s", line ); close(0); fd = open("/etc/passwd", O_RDONLY); if ( fd != 0 ){ fprintf(stderr,"Could not open data as fd 0\n"); exit(1); } /* read and print three lines */ fgets( line, 100, stdin ); printf("%s", line ); fgets( line, 100, stdin ); printf("%s", line ); fgets( line, 100, stdin ); printf("%s", line ); } 编译并运行上述代码 $ gcc 0o demo1 demo1.c $ ./demo1 //实现输入重定向 (2)利用dup2()函数实现重定向 // demo2.c #include #include

linux标准输入输出与重定向

LINUX 标准输入输出和重定向 1. 标准输入与输出 我们知道,执行一个shell 命令行时通常会自动打开三个标准文件,即标 准输入文件(stdin ),通常对应终端的键盘;标准输出文件(stdout )和标准错误输出文件(stderr ),这两个文件都对应终端的屏幕。进程将从标准输入文件中得到输入数据,将正常输出数据输出到标准输出文件,而将错误信息送到标准错误文件中。 我们以cat 命令为例,cat 命令的功能是从命令行给出的文件中读取数据,并将这些数据直接送到标准输出。若使用如下命令: $ cat config 将会把文件config 的内容依次显示到屏幕上。但是,如果cat 的命令行中没有参数,它就会从标准输入中读取数据,并将其送到标准输出。例如: $ cat Hello world Hello world Bye Bye $ 用户输入的每一行都立刻被cat 命令输出到屏幕上。 另一个例子,命令sort 按行读入文件正文(当命令行中没有给出文件名时,表示从标准输入读入),将其排序,并将结果送到标准输出。下面的例子是从标准输入读入一个采购单,并将其排序。 $ sort bananas carrots apples

apples bananas carrots $ 这时我们在屏幕上得到了已排序的采购单。 直接使用标准输入/输出文件存在以下问题: 输入数据从终端输入时,用户费了半天劲输入的数据只能用一次。下次再想用这些数据时就得重新输入。而且在终端上输入时,若输入有误修改起来不是很方便。 输出到终端屏幕上的信息只能看不能动。我们无法对此输出作更多处理,如将输出作为另一命令的输入进行进一步的处理等。 为了解决上述问题,Linux系统为输入、输出的传送引入了另外两种机制,即输入/输出重定向和管道。 2.输入重定向 输入重定向是指把命令(或可执行程序)的标准输入重定向到指定的文件中。也就是说,输入可以不来自键盘,而来自一个指定的文件。所以说,输入重定向主要用于改变一个命令的输入源,特别是改变那些需要大量输入的输入源。 例如,命令wc统计指定文件包含的行数、单词数和字符数。如果仅在命令行上键入: $ wc wc将等待用户告诉它统计什么,这时shell就好象死了一样,从键盘键入的所有文本都出现在屏幕上,但并没有什么结果,直至按下<ctrl+d>,wc才将命令结果写在屏幕上。 如果给出一个文件名作为wc命令的参数,如下例所示,wc将返回该文件所包含的行数、单词数和字符数。 $ wc /etc/passwd 20 23 726 /etc/passwd $ 另一种把/etc/passwd文件内容传给wc命令的方法是重定向wc的输入。输入重定向的一般形式为:命令<文件名。可以用下面的命令把wc命令的输入重定向为/etc/passwd文件:

1.3 Linux重定向和管道

1.3 Linux重定向和管道 计121晏霄122614 (实验估计时间:90分钟) 背景知识 实验目的 工具/准备工作 实验内容与步骤 可选练习 背景知识 在本实验中,我们将使用高级Linux命令来完成重定向和管道。每一个Linux命令都有一个源作为标准输入,一个目的作为标准输出。命令的输入通常来自键盘(尽管它也可以来自文件) 。命令通常输出到监视器或者屏幕上。Linux计算环境使用重定向可以控制命令的I/O。当试图把命令的输出保存到一个文件,以供以后查看的时候是很有用的。通过管道,可以取得一个命令的输出,把它作为另一个命令的进一步处理的输入。 有几个元字符可用于输入/输出重定向符号:输出重定向使用右尖括号(>,又称大于号) ;输入重定向使用左尖括号(<,又称小于号) ;出错输出重定向使用右尖括号之前有一个数字2 (如2>) 。本实验重点在输出重定向。 重定向命令的格式是: Command Redirection-Symbol File (text file or device file) 标准输出比标准输入或标准出错更经常被重定向。许多命令,如ls、cat、head和tail 产生标准输出到屏幕上,常常会希望把这个输出重定向到一个文件中,以便将来查看、处理或者打印。通过替换文件名,可以截获命令的输出,而不是让它到达默认的监视器上。 最强大的元字符之一是管道符号(|) 。管道取得一个命令的标准输出,把它作为标准输入传递给下一个命令(通常为more命令、lp (行式打印机) 命令或者一个文件处理命令,如grep或sort) 。必须在管道的每边都有一个命令,命令和管道之间的空格是可选的。 管道命令的格式是: command | command 实验目的 通过重定向和管道操作: 1) 熟悉输入/输出(I/O) 重定向; 2) 把标准输出重定向创建一个文件; 3) 防止使用重定向的时候覆盖文件; 4) 把输出追加到一个现有的文件中; 5) 把一个命令的输出导入到另一个命令中。 工具/准备工作 在开始本实验之前,请回顾教科书的相关内容。

管道通信

Linux的管道通信 进程通信的实用例子之一是Unix系统的管道通信。Unix系统从SystemV开始提供有名管道和无名管道两种数据通信方式。无名管道为建立管道的进程及其子孙提供一条以比特流方式传送消息的通信。该管道在逻辑上被看作管道文件,在物理上则由文件系统的高速缓冲区构成,而很少启动外设。有名管道可用于两个无关的进程之间的通信。 管道是Linux支持的最初Unix IPC形式之一,在Linux中是一种使用非常频繁的通信机制。从本质上说,管道也是一种文件,但它又和一般的文件有所不同,管道可以克服使用文件进行通信的两个问题,具体表现为: ·限制管道的大小。实际上,管道是一个固定大小的缓冲区。在Linux中,该缓冲区的大小为1页,即4K字节,使得它的大小不象文件那样不加检验地增长。使用单个固定缓冲区也会带来问题,比如在写管道时可能变满,当这种情况发生时,随后对管道的write()调用将默认地被阻塞,等待某些数据被读取,以便腾出足够的空间供write()调用写。 ·读取进程也可能工作得比写进程快。当所有当前进程数据已被读取时,管道变空。当这种情况发生时,一个随后的read()调用将默认地被阻塞,等待某些数据被写入,这解决了read()调用返回文件结束的问题。 注意:从管道读数据是一次性操作,数据一旦被读,它就从管道中被抛弃,释放空间以便写更多的数据。 管道是单向的、先进先出的、无结构的、固定大小的字节流,它把一个进程的标准输出和另一个进程的标准输入连接在一起。写进程在管道的尾端写入数据,读进程在管道的首端读出数据。数据读出后将从管道中移走,其它读进程都不能再读到这些数据。管道提供了简单的流控制机制。进程试图读空管道时,在有数据写入管道前,进程将一直阻塞。同样,管道已经满时,进程再试图写管道,在其它进程从管道中移走数据之前,写进程将一直阻塞。管道的创建 函数int pipe(int fd[2])创建一个管道,管道两端可分别用描述字fd[0]以及fd[1]来描述。需要注意的是,管道的两端是固定了任务的。即一端只能用于读,由描述字fd[0]表示,称其为管道读端;另一端则只能用于写,由描述字fd[1]来表示,称其为管道写端。如果试图从管道写端读取数据,或者向管道读端写入数据都将导致错误发生。一般文件的I/O函数都可以用于管道,如close、read、write等等。 使用管道通信时,可关闭某些不需要的读或写描述符,建立起单向的读或写管道,然后用read和write像操作文件一样去操作它: close(pipe_fd[0]);/*关闭读管道*/

shell基础五:输入和输出(echo,read,cat,管道,tee,重定向等)shell编程卓越资源-专业linuxunix资料站

shell基础五:输入和输出(echo,read,cat,管道,tee,重定向等) Shell编程卓越资源- 专业LinuxUnix资料站 shell基础五:输入和输出(echo,read,cat,管道,tee,重定向等) 下面的所有环境都在在REDHAT LINUX9下试验的 在LINUX中,要使转义符生效,需加参数-e 从echo的变量开始说起 如:e c h o命令输出转义符以及变量。 # echo -e "\007your home is $HOME , you are connected on `tty`" your home is /root , you are connected on /dev/pts/1 # echo -e "\ayour home is $HOME , you are connected on `tty`" your home is /root , you are connected on /dev/pts/1 #

本例中 \007或\a你可以让终端铃响一声 显示出$ H O M E目录, 并且可以让系统执行t t y命令(注意,该命令用键盘左上角的符号,法语中的抑音符引起来,不是单引号)。 在e c h o命令输出之后附加换行,可以使用\ n选项:$ cat echod #!/bin/sh echo -e "this echo's 3 new lines\n\n\n" echo "OK" 编辑一个新echod,如上内容,然后运行输出如下:$ ./echod this echo's 3 new linesOK

$ 在e c h o语句中使用跳格符,记住别忘了加反斜杠\: $ echo -e "here is a tab\there are two tabs\t\tok" here is a tab here are two tabs ok $ 把一个字符串输出到文件中,使用重定向符号>。 在下面的例子中一个字符串被重定向到一个名为m y f i l e 的文件中: $ echo "The log files have all been done"> myfile 或者可以追加到一个文件的末尾,这意味着不覆盖原有的内容: $ echo "$LOGNAME carried them out at `date`">>myfile 现在让我们看一下m y f i l e文件中的内容: The log files have all been done

linux中的重定向

重定向 求助编辑百科名片 重定向说白了就是通过各种的方法将各种网络请求重新定个方向转到其它位置(如:网页重定向、域名的重定向、路由选择的变化也是对数据报文经由路径的一种重定向)。 Linux重定向 1、基本概念 a、I/O重定向通常与FD有关,shell的FD通常为10个,即0~9; b、常用FD有3个,为0(stdin,标准输入)、1(stdout,标准输出)、2(stderr,标准错误输出),默认与keyboard、monitor、monitor有关; c、用< 来改变读进的数据信道(stdin),使之从指定的档案读进; d、用> 来改变送出的数据信道(stdout, stderr),使之输出到指定的档案; e、0 是< 的默认值,因此< 与0<是一样的;同理,> 与1> 是一样的; f、在IO重定向中,stdout 与stderr 的管道会先准备好,才会从stdin 读进资料; g、管道“|”(pipe line):上一个命令的stdout 接到下一个命令的stdin; h、tee 命令是在不影响原本I/O 的情况下,将stdout 复制一份到档案去; i、bash (ksh)执行命令的过程:分析命令-变量求值-命令替代

(``和$( ))-重定向-通配符展开-确定路径-执行命令;j、( ) 将command group 置于sub-shell 去执行,也称nested sub-shell,它有一点非常重要的特性是:继承父shell 的Standard input, output, and error plus any other open file descriptors。k、exec 命令:常用来替代当前shell 并重新启动一个shell,换句话说,并没有启动子shell。使用这一命令时任何现有环境都将会被清除。exec 在对文件描述符进行操作的时候,也只有在这时,exec 不会覆盖你当前的shell 环境。 2、基本IO cmd > file 把stdout 重定向到file 文件中;cmd >> file 把stdout 重定向到file 文件中(追加);cmd 1> fiel 把stdout 重定向到file 文件中;cmd > file 2>&1 把stdout 和stderr 一起重定向到file 文件中;cmd 2> file 把stderr 重定向到file 文件中;cmd 2>> file 把stderr 重定向到file 文件中(追加);cmd >> file 2>&1 把stderr 和stderr 一起重定向到file 文件中(追加);cmd < file >file2 cmd 命令以file 文件作为stdin,以file2 文件作为stdout;cat <>file 以读写的方式打开file;cmd < file cmd 命令以file 文件作为stdin;cmd << delimiter Here document,从stdin 中读入,直至遇到delimiter 分界符。

相关主题
文本预览
相关文档 最新文档