一、管道
管道分为匿名管道和命名管道
管道是一种两个进程间进行单向通信的机制。 管道是一种最基本的IPC机制,作用于有血缘关系的进程之间,完成数据传递。调用pipe系统函数即可创建一个管道。管道又分为匿名管道和命名管道。管道有如下特质:
(1)其本质是一个伪文件(实为内核缓冲区)
(2) 由两个文件描述符引用,一个表示读端,一个表示写端。
(3) 规定数据从管道的写端流入管道,从读端流出。
匿名管道:
匿名管道的特征:
(1)只能进行单向通信;
(2)只适用于有血缘关系之间的进程;
(3)自带同步基质;
(4)在进行通信时面向字节流服务;
(5)生命进程随周期。
命名管道(FIFO):
FIFO不同于管道之处在于它提供一个路径名与之关联,以FIFO的文件形式存储于文件系统中。命名管道是一个设备文件,因此,即使进程与创建FIFO的进程不存在亲缘关系,只要可以访问该路径,就能够通过FIFO相互通信。值得注意的是,FIFO(first
input first output)总是按照先进先出的原则工作,第一个被写入的数据将首先从管道中读出。
二、消息队列
消息队列,是消息的链接表,存放在内核中。一个消息队列由一个标识符(即队列ID)来标识。
特点
-
消息队列是面向记录的,其中的消息具有特定的格式以及特定的优先级。
-
消息队列独立于发送与接收进程。进程终止时,消息队列及其内容并不会被删除。
-
消息队列可以实现消息的随机查询,消息不一定要以先进先出的次序读取,也可以按消息的类型读取。
另外,当某个进程向内核空间写入数据的时候,内核会创建相应的用户ID、读写进程的ID或者是优先级等信息,然后和读入的数据打包成数据包,也就是消息。
三、共享内存:
共享内存指得是内核空间中的一块公共内存区域。
在多个进程获取共享内存区域的同一块资源的时候,可以使用信号量来实现进程间的互斥和同步。
四、信号量
信号量(semaphore)与已经介绍过的 IPC 结构不同,它是一个计数器。信号量用于实现进程间的互斥与同步,而不是用于存储进程间通信数据。
特点
-
信号量用于进程间同步,若要在进程间传递数据需要结合共享内存。
-
信号量基于操作系统的 PV 操作,程序对信号量的操作都是原子操作。
-
每次对信号量的 PV 操作不仅限于对信号量值加 1 或减 1,而且可以加减任意正整数。
-
支持信号量组(每种共享资源对应一个信号量,多种对应多个信号量,也就是信号集或者信号量组)。