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

3/8/2017来源:ASP.NET技巧人气:403



进程有独立性,有自己的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

运行结果: