您的位置:首页 > 运维架构 > Linux

Linux进程间通信(一)-------管道

2017-03-03 13:38 274 查看

进程有独立性,有自己的PCB和地址空间,彼此之间不会互相干扰。
进程间通信的原理(本质):想办法让不同的进程看到一份公共的系统资源(数据)。
注:这份资源通常由操作系统提供,该资源不属于任何一个
进程。该资源是有由某种方式提供的缓冲区。
    系统公共区域提供模块的的不同导致了通信方式的不同。
管道(pipe):是最基本的IPC机制,也是一种文件。
管道的特点:管道只允许单向通信。
        管道只适用于有血缘关系的进程,常用于父子进程之间的通信。
        管道是面向字节流的。
        管道是依赖于文件系统的,通信双方的进程退出,管道就结束了,所以其生命周期叫做随进程。
        管道不用任何保护机制,已经自主完成相关同步操作,从而保证了双方一致性。管道内部已经实现同步机制,当读时没数据就不再读了,写满不再写了。
匿名管道:只适用于有血缘关系的进程,常用于父子进程之间的通信。
测试代码如下:



运行结果:



使用管道需注意以下3种情况(假设都是阻塞I/O操作,没设置O_NONBLOCK标志)
1、如果所有指向管道写端的文件描述符都关闭了(管道写端的引用计数为0),而仍然有进程从管道读端读数据,那么管道中的剩余的数据都被读取后,再次read会返回0,就像读到文件末尾一样。测试代码及运行结果:




如果有指向管道写端的⽂文件描述符没关闭(管道写端的引⽤用计数⼤大于0),而持有管道写端的进程也没有向管道中写数据,这时有进程从管道读端读数据,那么管道中剩余的数据都被读取后,再次read会阻塞,直到管道中有数据可读了才读取数据并返回。测试代码及运行结果:





3、如果所有指向管道读端的文件描述符都关闭了(管道读端的引⽤用计数等于0),这时有进程向管道的写端write,那么该进程会收到信号SIGPIPE,通常会导致进程异常终⽌止。测试代码及运行结果:





命名管道:FIFO不同于管道之处在于它提供一个路径名与之关联,以FIFO的⽂文件形式存储于⽂文件系统中。命名管道是⼀一个设备⽂文件,因此,即使进程与创建FIFO的进程不存在亲缘关系,只要可以访问该路径,就能够通过FIFO相互通信。
命名管道(FIFO)原理:两个进程往同一个文件读写数据。
标识文件的方式:路径+文件名
命名管道的创建
代码如下:
client.c



server.c



运行结果:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息