Linux下:
1.管道: 管道通信的方式就是共享文件通信的方式,在连接的两个进程之间建立一个共享文件,也称pipe文件,可以传输大量数据。它与一般相比有些特殊:
1.专门用于通信 2.只能单向传送 3.在读写操作中,进程之间需要的同步和互斥是由系统自动执行的。
分为无名管道: 临时无名文件。在物理上由文件系统的高速缓冲区构成,很少启动外部设备 。因为是临时的,所以文件被关系后,文件就不存在了。用户看不到存在,不需要系统调用open打开,建立就可以直接使用。只能在祖先进程,子孙进程,这种有家族关系的管道才能存在。
有名管道:在磁盘上会有对应的目录,是真实文件。可实现无家族关系进程的通信。但双方依然是单向的。
2.共享内存的方式
在内存中划出一块内存区作为共享数据区,称之为共享内存区。要通信的双方将自己的虚拟地址空间映射到内存分区上。
共享内存是最快的一种 IPC,因为进程是直接对内存进行存取。因为多个进程可以同时操作,所以需要进行同步。
3.消息队列
消息队列,是消息的链接表,存放在内核中。一个消息队列由一个标识符(即队列ID)来标识。
1、特点
消息队列是面向记录的,其中的消息具有特定的格式以及特定的优先级。
消息队列独立于发送与接收进程。进程终止时,消息队列及其内容并不会被删除。
消息队列可以实现消息的随机查询,消息不一定要以先进先出的次序读取,也可以按消息的类型读取。
函数msgrcv
在读取消息队列时,type参数有下面几种情况:
type == 0
,返回队列中的第一个消息;type > 0
,返回队列中消息类型为 type 的第一个消息;type < 0
,返回队列中消息类型值小于或等于 type 绝对值的消息,如果有多个,则取类型值最小的消息。
可以看出,type值非 0 时用于以非先进先出次序读消息。也可以把 type 看做优先级的权值。(其他的参数解释,请自行Google之)
参考链接:https://www.cnblogs.com/zgq0/p/8780893.html
4.信号量
信号量(semaphore)是一个计数器。信号量用于实现进程间的互斥与同步,而不是用于存储进程间通信数据。
1、特点
-
信号量用于进程间同步,若要在进程间传递数据需要结合共享内存。
-
信号量基于操作系统的 PV 操作,程序对信号量的操作都是原子操作。
-
每次对信号量的 PV 操作不仅限于对信号量值加 1 或减 1,而且可以加减任意正整数。
-
支持信号量组。
2、原型
最简单的信号量是只能取 0 和 1 的变量,这也是信号量最常见的一种形式,叫做二值信号量(Binary Semaphore)。而可以取多个正整数的信号量被称为通用信号量。
Linux 下的信号量函数都是在通用的信号量数组上进行操作,而不是在一个单一的二值信号量上进行操作。
5.套接字( socket ) :
- 套解口也是一种进程间通信机制,与其他通信机制不同的是,它可用于不同机器间的进程通信。
参考: