管道是Linux最早使用的进程通信机制之一。管道只能实现具有亲缘关系的进程(如父进程与子进程等)间的通信,而有名管道克服了这一缺点。管道是单向的,数据只能从一端写入,从另一端读取。如果要进行全双工通信,就需要建立两个管道。管道还有其他一些不足,如管道没有名字,管道的缓冲区大小是受限制的,管道所传送的是无格式的字节流等。管道的输入方和输出方事先须约定好数据的格式。
使用管道进行通信时,两端的进程向管道读写数据是通过创建管道时系统设置的文件描述符进行的。因此,对于管道两端的进程来说,管道就是一个特殊的文件,这个文件只存在于内存中。在创建管道时,系统为管道分配一个页面作为数据缓冲区,进行管道通信的两个进程通过读写这个缓冲区来进行通信。
通过管道通信的两个进程,一个进程向管道写数据,另外一个进程从管道的另一端读数据。写入的数据每次都添加在管道缓冲区的末尾,读数据时都是从缓冲区的头部读出数据。
常见管道的相关函数有如下几种。
1.popen()
函数原型为
该函数会调用fork()产生子进程,然后从子进程中调用/bin/sh-c来执行参数command的指令。参数type可使用“r”代表读取,使用“w”代表写入。依照此type值,popen()会建立管道连到子进程的标准、输出设备或标准输入设备,然后返回一个文件指针。随后,进程便可利用此文件指针来读取子进程的输出设备或写入到子进程的标准输入设备中。
如果函数执行成功,则返回文件指针,否则返回NULL。(www.xing528.com)
2.pipe()
函数原型为
该函数会创建管道,并将文件描述词由参数filedes数组返回。filedes[0]为管道的读取端,filedes[1]为管道的写入端。如果从管道写端读数据或者向管道写端读数据,都将导致出错。若函数执行成功,则返回0,否则返回-1。
3.pclose()
函数原型为
该函数用来关闭由popen()所建立的管道及文件指针。参数stream为先前由popen()所返回的文件指针。如果执行成功,则返回子进程的结束状态,否则返回-1。管道一旦创建成功,就可以作为一般的文件来使用。对一般文件进行操作的I/O函数也适用于管道。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。