Linux - 进程间通信 - 匿名管道

一、概念:进程间通信( IPC,InterProcess Communication)

  每个进程各自有不同的用户地址空间,任何一个进程的全局变量在另一个进程中都看不到,所以进城之间要交换数据必须通过内核,

在内核中 开辟一块缓冲区进程1把数据从用户空间拷到内核缓冲区,进程2再从内核缓冲区把数据读走,内接提供的这种机制成为进程间

通信(IPC,InterProcess Communication)。

二、管道

  管道分为匿名管道和命名管道,这里我们只讲匿名管道,命名管道的实现将在下一篇文章中分享。

  1、管道是一种最基本的IPC机制,有pipe函数创建:

    头文件#include <unistd.h>

    函数原型:int pipe ( int fileds[2] );

    返回值:调用成功返回0,调用失败返回-1.

    调用pipe函数时,在内核中开辟一块缓冲区(称为管道),用于通信,他有一个读端一个写端,然后通过fileds参数传出给用户

  程序两个文件描述符,fileds[0]指向管道的读端,fileds[1]指向管道的写端。所以管道在用户程序看起来就像一个打开的文件,通过

  read(fileds[0]);或write(fileds[1])向这个文件读写数据,其实是在读写内核缓冲区。

  2、管道实现进程间通信的过程:

    Step1:父进程调用pipe开辟管道,得到两个文件描述符指向管道的读端和写端;

    Step2:父进程调用fork函数创建子进程,那么子进程也有两个文件描述符指向同一管道的读端和写端;

    Step3:父进程关闭管道读端,子进程关闭管道写端。父进程就可以网管道里写数据,子进程可以从管道中读数据,管道适用

  缓刑队列实现的,数据从写端流入,从读端流出,这样就实现了进程间通信。

  3、匿名管道的特点(简称管道):

    (1)管道只支持单向通信。(要想父子进程间通信必须关闭相应的读、写端)

    (2)管道用于具有亲戚关系的进程间通信,常用于父子进程间通信。(子进程继承父进程的文件描述符表,所以可以指向同一管道,看到同一份数据)

    (3)管道依赖于文件系统。

    (4)管道的生命周期随进程的结束而结束。

    (5)面向字节流

    (6)管道内部提供同步互斥机制

  4、匿名管道的实现:

运行结果:

时间: 2024-10-11 07:01:36

Linux - 进程间通信 - 匿名管道的相关文章

Linux进程间通信-匿名管道

前面我们讲了进程间通信的一种方式,共享内存.下面看一看另一种机制,匿名管道.1.什么是管道管道是一个进程的数据流到另一个进程的通道,即一个进程的数据输出作为另一个进程的数据输入,管道起到了桥梁的作用.比如,在shell中输入命令:ls -l|grep string,ls和grep是两个进程,"|"符号表示管道,意思是执行ls -l进程,并将输出结果result_1,作为grep string进程的输入result_0,grep进程将result_0中存在字符串string的信息打印到屏

Linux进程间通信:管道

提到进程间通信,我们需要先了解一下进程是什么: 其实在Linux下,早期的Linux为了实现多个程序之间的交替操作,出现了进程的概念.为的就是维护操作系统整个的运行逻辑.并发就是进程间的交替执行. 进程是程序的动态实例. 进程并发运行的环境中,多个进程之间存在如下竞争和合作的关系: -          进程中的资源争用(间接作用) 当并发进程竞争使用同一个资源时,它们之间就会发生冲突.为了避免冲突,当一个进程获得资源时,另一个进程必须等待.这种情况需要通过互斥机制来解决. -         

Linux进程间通信-命名管道

前面我们讲了进程间通信的一种方式,匿名管道.我们知道,匿名管道只能用于父子关系的进程之间.那么没有这种关系的进程之间该如何进行数据传递呢? 1.什么是命名管道 匿名管道是在缓存中开辟的输出和输入文件流的空间,只能用于父子关系的进程之间.因为父子进程的输入和输出文件描述符是一致的.命名管道是一种实际存在的FIFO文件,称作“管道文件”,用于不同进程之间,命名管道进程间打开同一个FIFO文件,进行数据传递.我们可以像普通文件一样操作FIFO文件.不同进程,引用同一个FIFO文件,进行数据传递. 2.

Linux进程间通信之管道(pipe)、命名管道(FIFO)与信号(Signal)

整理自网络 Unix IPC包括:管道(pipe).命名管道(FIFO)与信号(Signal) 管道(pipe) 管道可用于具有亲缘关系进程间的通信,有名管道克服了管道没有名字的限制,因此,除具有管道所具有的功能外,它还允许无亲缘关系进程间的通信: 实现机制: 管道是由内核管理的一个缓冲区,相当于我们放入内存中的一个纸条.管道的一端连接一个进程的输出.这个进程会向管道中放入信息.管道的另一端连接一个进程的输入,这个进程取出被放入管道的信息.一个缓冲区不需要很大,它被设计成为环形的数据结构,以便管

Linux进程间通信之管道

1,进程间通信 (IPC ) Inter-Process Communication 比较好理解概念的就是进程间通信就是在不同进程之间传播或交换信息. 2,linux下IPC机制的分类:管道.信号.共享内存.消息队列.信号量.套接字 3,这篇主要说说管道:本质是文件,其他理论什么的网上已经有一大堆了,我就只写一点用法吧. 3.1 特点 1)管道是最古老的IPC,但目前很少使用     2)以文件做交互的媒介,管道分为有名管道和无名管道     3)历史上的管道通常是指半双工管道 3.2 管道:有

linux 进程间通信-有名管道(FIFO)

有名管道(FIFO) 命名管道也被称为FIFO文件,是一种特殊的文件.由于linux所有的事物都可以被视为文件,所以对命名管道的使用也就变得与文件操作非常统一. (1)创建命名管道 用如下两个函数中的其中一个,可以创建命名管道. #include <sys/types.h> #include <sys/stat.h> int mkfifo(const char *filename, mode_t mode); int mknod(const char *filename, mode

Linux 进程间通信之管道(pipe),(fifo)

 无名管道(pipe) 管道可用于具有亲缘关系进程间的通信,有名管道克服了管道没有名字的限制,因此,除具有管道所具有的功能外,它还允许无亲缘关系进程间的通信: 定义函数: int pipe(int filedes[2]) filedes[0]为管道里的读取端 filedes[1]则为管道的写入端. 实现机制: 管道是由内核管理的一个缓冲区,相当于我们放入内存中的一个纸条.管道的一端连接一个进程的输出.这个进程会向管道中放入信息.管道的另一端连接一个进程的输入,这个进程取出被放入管道的信息.一个缓

linux进程间通信-有名管道(FIFO)

有名管道(FIFO) 命名管道也被称为FIFO文件,是一种特殊的文件.由于linux所有的事物都可以被视为文件,所以对命名管道的使用也就变得与文件操作非常统一. (1)创建命名管道 用如下两个函数中的其中一个,可以创建命名管道. #include <sys/types.h> #include <sys/stat.h> int mkfifo(const char *filename, mode_t mode); int mknod(const char *filename, mode

linux进程间通信--有名管道

有名管道 只有当一个库函数失败时,errno才会被设置.当函数成功运行时,errno的值不会被修改.这意味着我们不能通过测试errno的值来判断是否有错误存在.反之,只有当被调用的函数提示有错误发生时检查errno的值才有意义. 查看错误代码errno是调试程序的一个重要方法.当linux C api函数发生异常时,一般会将errno变量(需include errno.h)赋一个整数值,不同的值表示不同的含义,可以通过查看该值推测出错的原因.在实际编程中用这一招解决了不少原本看来莫名其妙的问题.