全部博文(55)
分类: LINUX
2011-05-05 11:54:28
13-进程间通信:管道
管道通信
(1)管道通信是单向的,先进先出的,它把一个进程的输出与另一个进程的输入联系在一起。
一个进程(写进程)在管道的尾部写入数据,另一个进程(读进程)从管道的头部读出
数据。(2)数据被一个进程读出后,将被从管道中删除,其他读进程将不能从中再读到数
据。管道提供了简单的流控制机制,进程试图读取空的管道时将会被阻塞。同样,管道
已经满时,进程再试图写入数据是也会被阻塞。
分类:管道分为有名管道(FIFO)和无名管道。有名管道用于系统中任意两个进程之间通
信,无名管道用于父子进程之间通信。
无名管道:
popen 和pclose函数
简单地在两个程序之间传递数据。使用的是高级的函数 popen 和 pclose 函数。
函数描述:
popen 函数允许在一个程序中将另一个程序做为新进程来启动,并可以传递数据给它或者通过它来接收数据。command 字符串是要运行的程序名和相应的参数。open_mode 必须是“r”或者“w”。popen 成功时返回一个 FILE * 文件流指针,关联到新的程序。失败时返回一个空指针。
请求 popen 调用运行一个程序时,它首先启动 shell ,即系统中的 sh 命令,然后将command 字符串作为一个参数传递给它。针对每个 popen 调用,不仅要启动一个被请求的程序还是启动一个shell,即popen调用将多启动两个进程,从节省系统资源的角度来看,popen 函数调用的成本略高的,而且对目标命令的调用比正常方式要慢一些。
函数描述:
关闭与之关联的文件流。pclose 调用只在 popen 启动的进程结束后才返回。如果调用pclose 时它仍在运行,pclose 将等待该进程的结束。pclose 调用返回它所关闭的文件流所在进程的退出码。
pipe 调用
函数描述:
pipe 调用用两个文件描述符file_descripter[]创建一个管道,文件描述符file_descripter[1](管道尾)用于向管道中写数据,文件描述符file_descripter[0](管道头)用于从管道中读数据。管道有一些内置的缓冲区,他在read 和 write 直接保存数据pipe 调用在file_descripter[]数组中填好两个文件描述符之后返回0,失败返回-1。在这里要注意的是,pipe 调用使用的是文件描述符而不是文件流,所以我们必须用底层的 read 和 write 来访问数据,而不是用 fread 和 fwrite 。pipe 主要用于在父子进程之间传递数据。
命名管道:FIFO
命名管道是一种特殊类型的文件,它在文件系统中以文件名的形式存在。它可以在系统
中的任意两个进程之间进行通信,而无名管道智能在相关的两个程序之间通信,即这些程序
是由一个共同的祖先进程启动的。FIFO 的使用不仅向我们提供了进程间的同步,还提供了
双向的数据流。
函数描述:
一旦创建了一个 FIFO ,就可以用 open 打开它,一般的文件访问函数(close、read、
write)都可以用于操作FIFO。
使用open 打开 FIFO:
要注意这四种打开FIFO方式的区别,具体可参考LINUX系统自带的手册页。