linux进程通信之管道

原创 2011年01月21日 22:32:00

    管道:可分为普通管道和命名管道。普通管道用于有亲缘关系的进程间的通信(父子进程).命名管道,通过给管道命名的方式,使得管道变成文件系统中的管道文件,从而允许无亲缘关系的进程间通过访问管道文件进行通信。
    管道是单向的,一端只能用于输入,另一端只能用于输出。管道是FIFO的,即先进先出的,向管道中写入的数据附加至管道缓冲区的尾部,而读数据是从管道缓冲区的头部开始的。普通管道只能用于有亲缘关系的进程间的通信。Linux系统下,管道缓存区为4096字节,缓存区满时,阻塞写操作;缓存区空时,阻塞读操作。
    对管道的操作主要有,创建管道,读写管道,关闭管道。一般情况下,都是由父进程创建管道,并将该管道传递给子进程,这样父子进程就可以通信了。
    创建管道函数:int pipe(int pipedes[2]);
    返回值:0,成功,-1失败。
    pipedes:整形数组,pipedes[0]用于读操作,pipedes[1]用于写操作。
   
    读写管道函数:
        int read(int fd, char * buf, int bufsize);
        int write(int fd, char *buf, int bufsize);
    关闭管道函数: int close(int fd); //管道句柄
    例子:


   
    命名管道:命名管道提供了一个文件名同管道关联。在管道创建成功后,在文件系统中将产生一个物理的FIFO文件。对命名管道的操作,实际上是通过该FIFO文件实现的。命名管道可以用于无亲缘关系的进程进行数据交换。
    管道创建:
  #include <sys/stat.h>
  int mkfifo( const char* pathname,  mode_t mode );
  返回值:0,成功;-1,失败
  pathname:文件路径和文件名。
  mode:管道的访问权限,与文件的访问权限相同。
  
  对管道的打开包括两种方式:阻塞和非阻塞方式。(int open( const char * pathname, int flags);)
  当flags为O_NONBLOCK,将以非阻塞的方式打开。
  1、当使用O_NONBLOCK 旗标时,打开FIFO 文件来读取的操作会立刻返回,但是若还没有其他进程打开FIFO 文件来读取,则写入的操作会返回ENXIO 错误代码。
  2、没有使用O_NONBLOCK 旗标时,打开FIFO 来读取的操作会等到其他进程打开FIFO文件来写入才正常返回。同样地,打开FIFO文件来写入的操作会等到其他进程打开FIFO文件来读取后才正常返回。
  
  例子:


版权声明:本文为博主原创文章,未经博主允许不得转载。

Linux下的进程通信方式: 管道通信详解

管道是单向的、先进先出的、无结构的字节流,它把一个进程的输出和另一个进程的输入连接在一起。...
  • rl529014
  • rl529014
  • 2016年05月20日 21:03
  • 3869

linux进程间通信-----管道总结实例

linux进程间通信-----管道总结实例
  • Linux_ever
  • Linux_ever
  • 2015年12月20日 22:20
  • 1604

C/C++:linux进程通信简单例子(管道)

#include #include #include #include #include int main(void) { int fd[2],nbytes; pid_t ...
  • zg260
  • zg260
  • 2014年06月26日 17:19
  • 721

Linux进程间通信方式之管道(pipe)

每个进程各自有独立的用户地址空间,任何一个进程的全局变量在另一个进程中都看不到,但是所有进程都共享内核地址空间,所以进程之间要交换数据必须通过内核,在内核中开辟一块缓冲区,进程1把数据从用户空间拷到内...
  • yangwen123
  • yangwen123
  • 2013年11月04日 08:18
  • 5671

linux c之通过管道实现兄弟间进程通信:

1、兄弟间进程通信:          父进程创建管道,并使用fork函数创建2个进程,在第一个子进程发消息到第二个子进程,第2个子进程读取消息并处理,在父进程中不使用管道通信,所以什么都不做,直接关...
  • u011068702
  • u011068702
  • 2017年02月10日 17:47
  • 276

Linux 进程通信之管道

管道是单向的、先进先出的,它把一个进程的输出和另一个进程的输入连接在一起。一个进程(写进程)在管道的尾部写入数据,另一个进程(读进程)从管道的头部读出数据。数据被一个进程读出后,将被从管道中删除,其他...
  • u011641885
  • u011641885
  • 2015年08月03日 00:06
  • 601

Linux 下父进程与子进程的通信(pipe管道)

转自http://siqun.blog.163.com/blog/static/213496001201341231121720/ 每个进程各自有不同的用户地址空间,任 何一个进程的全局变量...
  • xy010902100449
  • xy010902100449
  • 2015年04月03日 09:20
  • 7235

Linux进程通信之管道

》进程通信:是指进程之间的信息交换,所交换的内容少则一个状态或数值,多则成千上万个字节。 》之前所讲的进程之间交换信息的方法只有fork()或者exec传送打开文件,或者通过文件系统。现在我们要说明进...
  • Sherry_Wangnana
  • Sherry_Wangnana
  • 2016年07月06日 08:43
  • 389

进程间通信(IPC)之管道家族

史上最全面剖析进程间通信下的管道,细谈管道,从基础学起,逐步深入。欢迎各位博友来访,交流学习,共同进步........
  • Xiao__Tian__
  • Xiao__Tian__
  • 2016年07月04日 22:25
  • 3629

Linux进程间通信(一)之无名管道(PIPE)和有名管道(FIFO)

何为进程间通信进程间通信(IPC,InterProcess Communication)是指在不同进程之间传播或交换信息。简单说就是进程之间可以相互发送数据。 IPC的方式通常有管道(包括无名管道和...
  • yishizuofei
  • yishizuofei
  • 2017年10月21日 09:43
  • 137
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:linux进程通信之管道
举报原因:
原因补充:

(最多只允许输入30个字)