一、管道
UNIX 系统IPC最古老的形式。
特点:
- 只支持半双工通信(单向交替传输)
- 只能在父子进程或兄弟进程之间通信
- 只存在于内存中,不属于任何文件系统
二、命名管道(FIFO)
常用于C/S应用程序中,FIFO 用作汇聚点,在客户进程和服务器进程之间传递数据,它是一种文件类型。
特点:
- 不再局限于父子进程和兄弟进程之间的通信,可以在任意进程之间通信
- 有路径名与之关联,以一种特殊设备文件形式存在文件系统
三、消息队列
消息队列,是消息的链表,存放在内核中。一个消息队列由一个标识符(即队列ID)来标识。
特点:
- 队列中的消息可以有特定的格式、类型和优先级
- 可独立于读写进程存在,进程终止时,队列中的消息也不会被删除
- 避免同步阻塞问题,不需要进程自己提供同步方法
- 实现消息的随机查询,读进程可根据消息类型有选择的接收消息
四、信号量机制
信号量(semaphore)是一个计数器,用于实现进程间的互斥与同步,而不是用于存储进程间通信数据。
最简单的信号量是只能取 0 和 1 的变量,叫做二值信号量(Binary Semaphore),可以取正整数的信号量被称为通用信号量。
注意
Linux 下的信号量函数都是在通用信号量数组上进行操作,而不是在二值信号量上进行操作。
特点:
- 信号量用于进程间同步,若要在进程间传递数据需要用共享内存的方式
- 信号量基于操作系统的 PV 操作,对信号量的操作都是原子操作(底层通过屏蔽中断的方式实现)
- 每次对信号量的 PV 操作可以加减任意正整数(不局限于+1和-1)
- 通过信号量组多条件的同步机制
五、共享内存
两个或多个进程共享一个给定的存储区。
特点:
- 最快的一种 IPC,因为进程是直接对内存进行存取,数据不需要在进程之间复制
- 多个进程可以同时操作,需要使用信号量进行同步
- 多个进程可以将同一个文件映射到它们的共享地址空间从而实现共享内存
六、Socket
套接字通信,不仅仅局限于单机进程间通信,更广泛用于不同机器之间的进程间通信。
特点:
- 支持不同机器之间的通信
- Socket不是协议,而是调用接口,通过Socket才能使用TCP/IP协议进行通信,过程需要经过“三次握手、四次挥手”