linux管道ppt

简介 相关

截图

linux管道ppt

简介

这是linux管道ppt,包括了重定向,管道,管道通信,重定向标准I/O,管道系统调用,管道—单向Vs双向等内容,欢迎点击下载。

linux管道ppt是由红软PPT免费下载网推荐的一款课件PPT类型的PowerPoint.

Linux管道通信 高文宇 gwy@gdcc.edu.cn Contents 重定向 管道 管道通信 重定向 “>”--标准输出重定向 “>>”--标准输出重定向,追加方式 “2>”--出错信息重定向 “<”--标准输入重定向 重定向标准I/O Linux shell(比如 Bash)接收或发送序列和字符串流 形式的输入或输出。每个字符都独立于与之相邻的字符。字符没有被组织成结构化记录或固定大小的块。不管实际的字符串流进入或来自文件、键盘、显示窗口或其他 I/O 设备,都使用文件 I/O 技术来访问流。Linux shell 使用 3 种标准的 I/O 流,每种流都与一个文件描述符相关联: stdout 是标准输出流,它显示来自命令的输出。它的文件描述符为 1。 stderr 是标准错误流,它显示来自命令的错误输出。它的文件描述符为 2。 stdin 是标准输入流,它为命令提供输入。它的文件描述符为 0。 输入流通常通过终端击键为程序提供输入。输出流通常向终端输出文本字符。最初的终端是 ASCII 打字机或显示终端,但现在更多是指图形桌面上的文本窗口。 重定向输出 可以通过两种方法将输出重定向到文件: n> 将输出从文件描述符 n 重定向到文件。用户必须具有该文件的写权限。如果该文件不存在,将创建它。如果该文件已经存在,通常将覆盖所有现有内容,并且没有任何警告。 n>> 还可以将输出从文件描述符 n 重定向到一个文件中。这里也一样要求用户具有该文件的写权限。如果该文件不存在,将创建它。如果该文件已经存在,输出将附加到现有的内容后面。 在 n> 或 n>> 中的 n 引用文件描述符。如果省略它,将执行标准输出。 重定向输出 在某些情况下,用户可能想要将标准输出和标准错误都重定向到一个文件中。这通常为自动进程或后台作业而执行的,以便以后可以查看输出。使用 &> 或 &>> 同时将标准输出和标准错误重定向到同一个文件中。另一种方法是,首先重定向文件描述符 n,然后使用 m>&n 或 m>>&n 将文件描述符 m 重定向到同一个文件。例如, command 2>&1 >output.txt 不同于 command >output.txt 2>&1 在第一种情况中,stderr 被重定向到 stdout 的当前位置,然后在将 stdout 重定向到 output.txt,但第二次重定向仅影响 stdout,不影响 stderr。在第二种情况中,stderr 被重定向到 stdout 的当前位置,即 output.txt。我们在清单 5 中显示了这些重定向。注意,在最后一个命令中先重定向标准错误在重定向标准输出,所以标准错误输出仍然打印在终端窗口中。 重定向输入 就像可以重定向 stdout 和 stderr 流一样,也可以使用 < 操作符从文件重定向 stdin。 管道 “ | ”—管道 将一个程序或命令的输出作为另一个程序或命令的输入,有两种方法,一种是通过一个临时文件将两个命令或程序结合在一起;另一种是Linux所提供的管道功能。这种方法比前一种方法更好。 管道可以把一系列命令连接起来,这意味着第一个命令的输出会作为第二个命令的输入通过管道传给第二个命令,第二个命令的输出又会作为第三个命令的输入,以此类推。显示在屏幕上的是管道行中最后一个命令的输出(如果命令行中未使用输出重定向)。 通过使用管道符“|”来建立一个管道行。 管道 利用一个管道 # rpm -qa|grep licq 这条命令使用一个管道符“|”建立了一个管道。管道将rpm -qa命令的输出(包括系统中所有安装的RPM包) 作为grep命令的输入,从而列出带有licq字符的RPM包来。 利用多个管道 # cat /etc/passwd | grep /bin/bash | wc -l 这条命令使用了两个管道,利用第一个管道将cat命令(显示passwd文件的内容)的输出送给grep命令,grep命令找出含有“/bin/bash”的所有行;第二个管道将grep的输入送给wc命令,wc命令统计出输入中的行数。这个命令的功能在于找出系统中有多少个用户使用bash。 Unix管道 为了完成一项任务,在两个或多个进程进行合作时间,必定会发生数据共享。即便信号在其处理异常事件或者错误的时候非常有用,也完全不适合从一个进程到另一个进程传输大量的信息。一种解决这个问题的方法是进程共享文件,因为没有任何限制来阻止若干进程同时读写同一个文件。但是,这可能是一种低效的方法,而且不得不小心避免进程间竞争的问题。 为了解决这一问题,UNIX提供了一个称为管道的概念。管道通常被用作单向的通信管道,该信道将一个进程与另一个进程连接在一起,同时也是UNIX文件概念的另一个推广。正如我们将要看到的,进程可以通过write系统调用来向管道发送数据,而另一端的进程也可以通过使用read来接收数据。 管道系统调用 在一个程序内部,可以通过一个叫pipe的系统调用来创建管道。如果成功,该调用返回两个文件描述符:一个向管道写入,一个从管道读出。Pipe定义如下: 用法: #include int pipe(int filedes[2]); filedes是一个有两个成员的整型数组,用来保存标识管道的文件描述符。如果这个调用成功。filedes[0]将用来从管道读出数据。同时filedes[1]用来向管道写入数据。 pipe调用有可能失败并返回-1。当这个调用可能导致比每个用户进程限制更多的文件描述符被打开(在此情况下,errno将设为EMFILE),或者内核的打开文件表溢出时(error将设为ENFILE),都会发生错误。 管道例程 创建了一个管道,写入三条消息,然后把它们读出来。 注意,消息读出的顺序与它们写入的顺序相同。管道按照先进先出(FIFO)来处理数据。换言之,第一个放入管道的消息在另一端也是第一个被读出来的。这个顺序不能更改,因为lseek对管道来说是无效的。 尽管在例子中读写管道时使用了相同大小的数据块,但实际上一个进程并不需要按照写入时数据块的大小从管道中读出这些数据。例如,一个管道可以依次写出512字节的数据块,然后每次只读出一个字符。但是使用固定大小的数据块是有好处的,这一点将在后面说明。 Pipe和fork 当管道和fork 系统调用一起使用的时候,才真正体现了它的价值。正因为通过fork调用生成的子进程将继承父进程的文件描述符,才使得子进程可以通过由父进程生成的管道与父进程通信。下面这个例子显示了这一点。父进程创建了一个管道,并且调用fork生成一个子进程。然后,子进程向父进程写入一串消息。 管道例程(2) pipe 管道—单向Vs双向 图7.2描述了这个例子的大概过程。它展示了管道连接两个进程的方式。正如你看到的,父进程和子进程都有两个打开的文件描述符,允许读写管道。因此,任何一个进程都可以向文件描述符p[1]写入,并且从p[0]中读出。这里存在一个问题,管道其实是强制用做单向的通信信道,而它本身是允许双向通信的。如果两个进程都同时地读写管道,结果将会发生混淆。 为了避免这一点,习惯上每个进程要么只读管道要么只写管道,并且关闭它不需要的文件描述符。事实上,程序为了避免在发送进程关闭其写入端时发生问题,就需要这样做,在7.1.4节将解释原因。迄今所有的例子之所以都可以工作,是因为接收进程确切地知道发送过来的数据到底有多少。下面的例子将展示这个问题的完整解决方案: 管道例程(3) Pipe 再见 再见 vf9红软基地

展开

同类推荐

热门PPT

相关PPT