Chinaunix首页 | 论坛 | 博客
  • 博客访问: 388863
  • 博文数量: 55
  • 博客积分: 1907
  • 博客等级: 上尉
  • 技术积分: 869
  • 用 户 组: 普通用户
  • 注册时间: 2010-11-04 19:30
文章分类

全部博文(55)

文章存档

2011年(32)

2010年(23)

分类: LINUX

2011-05-05 11:54:28

13-进程间通信:管道

 

管道通信 

1)管道通信是单向的,先进先出的,它把一个进程的输出与另一个进程的输入联系在一起。

一个进程(写进程)在管道的尾部写入数据,另一个进程(读进程)从管道的头部读出

数据。(2)数据被一个进程读出后,将被从管道中删除,其他读进程将不能从中再读到数

据。管道提供了简单的流控制机制,进程试图读取空的管道时将会被阻塞。同样,管道

已经满时,进程再试图写入数据是也会被阻塞。

分类:管道分为有名管道(FIFO)和无名管道。有名管道用于系统中任意两个进程之间通

信,无名管道用于父子进程之间通信。

 

无名管道: 

popen pclose函数

简单地在两个程序之间传递数据。使用的是高级的函数 popen pclose 函数。

  1. #include <stdio.h>

  2. FILE *popen( const char *command, const char *open_mode );

函数描述:

popen 函数允许在一个程序中将另一个程序做为新进程来启动,并可以传递数据给它或者通过它来接收数据。command 字符串是要运行的程序名和相应的参数。open_mode 必须是“r”或者“w”。popen 成功时返回一个 FILE * 文件流指针,关联到新的程序。失败时返回一个空指针。

请求 popen 调用运行一个程序时,它首先启动 shell ,即系统中的 sh 命令,然后将command 字符串作为一个参数传递给它。针对每个 popen 调用,不仅要启动一个被请求的程序还是启动一个shell,即popen调用将多启动两个进程,从节省系统资源的角度来看,popen 函数调用的成本略高的,而且对目标命令的调用比正常方式要慢一些。

 

  1. int pclose( FILE *stream_to_closes );

函数描述:

    关闭与之关联的文件流。pclose 调用只在 popen 启动的进程结束后才返回。如果调用pclose 时它仍在运行,pclose 将等待该进程的结束。pclose 调用返回它所关闭的文件流所在进程的退出码。

   

pipe 调用

  1. #include <unistd.h>

  2. int pipe( int file_descripter[2] );

 

函数描述:

pipe 调用用两个文件描述符file_descripter[]创建一个管道,文件描述符file_descripter[1](管道尾)用于向管道中写数据,文件描述符file_descripter[0](管道头)用于从管道中读数据。管道有一些内置的缓冲区,他在read write 直接保存数据pipe 调用在file_descripter[]数组中填好两个文件描述符之后返回0,失败返回-1。在这里要注意的是,pipe 调用使用的是文件描述符而不是文件流,所以我们必须用底层的 read write 来访问数据,而不是用 fread fwrite pipe 主要用于在父子进程之间传递数据。

 

 

命名管道:FIFO 

    命名管道是一种特殊类型的文件,它在文件系统中以文件名的形式存在。它可以在系统

中的任意两个进程之间进行通信,而无名管道智能在相关的两个程序之间通信,即这些程序

是由一个共同的祖先进程启动的。FIFO 的使用不仅向我们提供了进程间的同步,还提供了

双向的数据流。

 

  1. #include <sys/types.h>

  2. #include <sys/stat.h>

  3. int mkfifo( const char *filename , mode_t mode );

  4. int mknod(const char *filename, mode_t mode | S_IFIFO, (dev_t)0 );

 

函数描述:

    一旦创建了一个 FIFO ,就可以用 open 打开它,一般的文件访问函数(closeread

write)都可以用于操作FIFO

 

使用open 打开 FIFO

  1. open( const char *path, O_RDONLY );

  2. open( const char *path, O_RDONLY | O_NONBLOCK );

  3. open( const char *path, O_WRONLY );

  4. open( const char *path, O_RDONLY | O_NONBLOCK );

要注意这四种打开FIFO方式的区别,具体可参考LINUX系统自带的手册页。

 

 

阅读(1919) | 评论(0) | 转发(1) |
0

上一篇:07-数据管理

下一篇:02-Shell 程序设计

给主人留下些什么吧!~~