赞
踩
管道是UNIX中最古老的进程间通信机制,它提供进程之间单向通信的方法。简单地说,管道是连接一个进程的输出至另一个进程的输入的一种方法。
管道的使用很广泛,最常见的是在命令行中,例如,在下面的命令中就使用了管道:
$ cat file | grep "pipe" | more
这里,在cat、grep和more三个命令之间使用了两个管道,UNIX shell用这两个管道连接命令cat、grep和more,分别使得cat的标准输出成为grep的标准输入,grep的标准输出成为more的标准输入。
创建管道需调用pipe()函数。从管道的物理形状可推知,它应当有一个输入端和一个输出端。确实如此,pipe()的唯一参数是一个由两个整数组成的数组,该数组在pipe()调用成功后将含有作为管道使用的两个文件描述字,其中一个作为管道的输入,另一个作为管道的输出。
#include <unistd.h>
int pipe(int fdes[2]);
当进程调用pipe()成功时,内核在系统内部将创建一条管道,并设置由该管道使用的两个已打开文件描述字于数组fdes。其中fdes[0]设置为读而打开,是与输入端相连的文件描述字。fdes[1]设置为写而打开,是与输出端相连的文件描述字。一种较易记住谁是输入输出端描述字的方法是:由文件描述字0是标准输入,文件描述字1是标准输出,推出fdes[0]是输入端,fdes[1]是输出端。
pipe()调用成功返回0,否则返回-1并置errno错误条件。
管道有以下一些特点:
管道没有名字,因此也叫匿名管道,它是为了一次使用而创建的。
管道的两个描述字是同时打开的。如果从一个没有任何进程向它写的管道读数据(由于这些进程已关闭了所有文件或已退出),read将返回文件结束。如果往一个没有进程读它的管道中写数据,则视为错误;这将导致生成SIGPIPE信号,并且当信号被阻塞时将以EPIPE错误失败。
管道不允许文件定位,读和写操作都是顺序的,读从文件的开始处读,写则写至文件尾。
管道的用途在于父、子进程之间的通信。当我们需要在这样的两个进程之间传递数据时,管道的优势便体现出来了。
在第6章我们已经知道,当进程调用fork()派生一个子进程时,子进程将继承父进程所有打开的文件描述字。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。