第7单元-标准输入输出及重定向

第7单元-标准输入输出及重定向

第7单元-标准输入输出及重定向

管道与重定向

管道命令操作符是:”|”,它仅能处理经由前面一个指令传出的正确输出信息,也就是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

C语言标准输入输出详解

C CC C输入输出函数 输入输出函数输入输出函数 输入输出函数 本节主要介绍Turbo C2.0标准输入输出函数和文件的输入输出函数。通过本 节的学习可以使读者掌握Turbo C2.0的屏幕输出、键盘输入输出以及磁盘文件的 读写函数, 并能开始进行一些简单的程序的编写。 控制流程语句主要包括: 条件语句、循环语句和开关语句。 1.1 标准输入输出函数 1.1.1 格式化输入输出函数 Turbo C2.0 标准库提供了两个控制台格式化输入、输出函数printf( ) 和 scanf(), 这两个函数可以在标准输入输出设备上以各种不同的格式读写数据。 printf()函数用来向标准输出设备(屏幕)写数据; scanf() 函数用来从标准输入

设备(键盘)上读数据。下面详细介绍这两个函数的用法。 一、printf()函数 printf()函数是格式化输出函数, 一般用于向标准输出设备按 规定格式输出信息。在编写程序时经常会用到此函数。printf()函数的调用格式为: printf("<格式化字符串>", <参量表>); 其中格式化字符串包括两部分内容: 一部分是正常字符, 这些 字符将按原 样输出; 另一部分是格式化规定字符, 以"%"开始, 后跟一个或几个 规定字符, 用来确定输出内容格式。 参量表是需要输出的一系列参数, 其个数必须与格式化字符串 所说明的输出 参数个数一样多, 各参数之间用","分开, 且顺序一一对应, 否则 将会出现意想 不到的错误。 1. 格式化规定符 Turbo C2.0提供的格式化规定符如下: ━━━━━━━━━━━━━━━━━━━━━━━━━━ 符号作用 ────────────────────────── %d 十进制有符号整数 %u 十进制无符号整数

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选项防止了重定向过程覆盖文件___________________________________ _ _

拓展知识9-1 标准输入输出设备文件和流

拓展知识9-1 标准I/O设备文件和流 C程序中经常有大量对文件的输入输出操作,它构成了程序的重要部分,因而C语言提供了很多输入输出的函数,用于两种类型文件输入输出系统:即由ANSI标准定义的缓冲文件系统(也称标准文件(流)输入输出(I/O)系统);另一类是ANSI标准中没有定义的非缓冲文件系统(也称非标准文件(流)输入输出(I/O)系统)。 我们已经熟悉了通过键盘和显示器进行输入输出的一些函数,如scanf,printf 等等,这些通过控制台(键盘、显示器等)进行I/O的操作,可以看作标准文件输入输出系统的一些特例。任何C程序执行时,系统都定义了5个标准设备文件供使用。系统自动打开的5个标准设备文件为: 键盘(标准输入)stdin 0 显示器(标准输出)stdout 1 显示器(标准错误)stderr 2 串行口(标准辅助)stdoux 3 打印机(标准打印)stdprn 4 在C中可将数据的输入输出看作是数据的流入和流出,这样不管是普通(磁盘)文件或者是物理设备(打印机、显示器、键盘等),都可看作一种流的源和目的,视他们为同一种东西,而不管其具体的物理结构,即对他们的操作,就是数据的流入和流出。这种把数据的输入输出操作,抽象化为一种流,而不管它的具体结构的方法很有利于编程,而涉及流的输入输出操作函数可用于各种对象,与其具体的实体无关,即具有通用性。 在C语言中流可分为两大类,即文本流(text stream)和二进制流(binary stream)。所谓文本流是指在流中流动的数据是以字符形式出现。在文本流中,'\n'被换成回车CR和换行LF的代码0DH和0AH。而当输出时,则0DH和0AH被换成'\n'。二进制流是指流动的是二进制数字序列,若流中有字符,则用一个字节的二进制ASCII码表示,若是数字,则用一个字节的二进制数表示。在流入流出时,对\n符号不进行变换。 【示例】2001这个数,在文本流中用其ASCII码表示为:50 48 48 49共占4字节。而在二进制流中则表示为:00000111 11010001 用十六进制就是07D1。只占两字节。 由此看出,二进制流比文本流节省空间,且不用进行对\n的转换,这样可以大大加快流的速度,提高效率。因而,对于含有大量数字信息的数字流,可以采用二进制流的方式;对于含有大量字符信息的流,则采用文本流的方式。

linux管道学习笔记

声明:本文档所有内容均为网上整理所得,不保证所有内容正确性.版权属作者本人所有。不用做任何商业用途,仅供广大网友学习交流之用,如有侵权,请联系本人删除,若发现文档中内容有错误或者有个人见解,欢迎指教与相互讨论.Email:.weiming999@foxmail.com。 管道 无名管道 管道包括无名管道和有名管道两种,前者在父子进程中流行,后者由于可以独立成为磁盘文件而存在,因为能够被无血缘关系的进程共享. 无名管道通常直接称为管道,它占用两个文件描述符,不能被非血缘关系的进程共享,一般应用于父子进程. 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所有进程的功能。

(13)--标准输入输出_试卷

一、选择题 1.已知字符 ‘a’ 的ASCII码为 97 ,执行下列语句的输出是( )。 printf ("%d, %c", ’b’, ’b’+1 ) ; A.98, b B.语句不合法 C.98, 99 D.98, c 答案:D。 2.若a是基本整型变量,c是单精度实型变量,输入语句错误的是( )。 A.scanf(”%d,%f”, &a, &c); B.scanf(”d=%d, c=%f”, &a, &c); C.scanf(”%d%f”, &a, &c); D.scanf(”%d%f”, a, c); 答案:D。 3.执行语句 printf(" ______", 2); 将得到出错信息。 A.%d B.%o C.%x D.%f 答案:D。 4.下列代码段的输出为( )。 #include int main( void ) { int y; double d=3.4, x; x=(y=d/2.0)/2; printf(" (%0.2f, %d) ", x, y); return 0; } A.(0.00, 1)B.(0.85, 1.7)C.(0.50, 1)D.none of above 答案:A。 5.下列程序段输出结果为( )。 int x=1, y=012; printf(“%d”,y*x++); A.12B.10C.20D.24 答案:B。 二、填空题 1.写出下列代码段的输出结果_______。 float x1, x2; x1=3/2; x2=x1/2; printf("%d, %.1f", (int)x1, x2) ; 答案:1,0.5 2.下列代码段将会打印出_______。 printf("%#o\n", (010<<1^1)&(0xe<<1)); 答案:020。

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

C语言标准输入输出详解

C输入输出函数 本节主要介绍Turbo C2.0标准输入输出函数和文件的输入输出函数。通过本 节的学习可以使读者掌握Turbo C2.0的屏幕输出、键盘输入输出以及磁盘文件的 读写函数, 并能开始进行一些简单的程序的编写。 控制流程语句主要包括: 条件语句、循环语句和开关语句。 1.1 标准输入输出函数 1.1.1 格式化输入输出函数 Turbo C2.0 标准库提供了两个控制台格式化输入、输出函数printf( ) 和 scanf(), 这两个函数可以在标准输入输出设备上以各种不同的格式读写数据。 printf()函数用来向标准输出设备(屏幕)写数据; scanf() 函数用来从标准输入 设备(键盘)上读数据。下面详细介绍这两个函数的用法。 一、printf()函数 printf()函数是格式化输出函数, 一般用于向标准输出设备按规定格式输出

信息。在编写程序时经常会用到此函数。printf()函数的调用格式为: printf("<格式化字符串>", <参量表>); 其中格式化字符串包括两部分内容: 一部分是正常字符, 这些 字符将按原 样输出; 另一部分是格式化规定字符, 以"%"开始, 后跟一个或几个 规定字符, 用来确定输出内容格式。 参量表是需要输出的一系列参数, 其个数必须与格式化字符串 所说明的输出 参数个数一样多, 各参数之间用","分开, 且顺序一一对应, 否则 将会出现意想 不到的错误。 1. 格式化规定符 Turbo C2.0提供的格式化规定符如下: ━━━━━━━━━━━━━━━━━━━━━━━━━━符号作用 ────────────────────────── %d 十进制有符号整数 %u 十进制无符号整数 %f 浮点数 %s 字符串 %c 单个字符

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) 把一个命令的输出导入到另一个命令中。 工具/准备工作 在开始本实验之前,请回顾教科书的相关内容。

相关文档
最新文档