今天我们来回答一个问题:

进程之间通信的几种方式?

什么是进程间通信?

IPC(Inter- Process [ Communication](https://baike.baidu.com/item/ Communication/20394231), 进程间通信 )。进程间通信是指两个进程的数据之间产生交互。

进程间通信(IPC,Interprocess communication)是一组编程接口,让程序员能够协调不同的进程,使之能在一个操作系统里同时运行,并相互传递、交换信息。这使得一个程序能够在同一时间里处理许多用户的要求。因为即使只有一个用户发出要求,也可能导致一个操作系统中多个进程的运行,进程之间必须互相通信。IPC接口就提供了这种可能性。每个IPC方法均有它自己的优点和局限性,一般,对于单个程序而言使用所有的IPC方法是不常见的。

经过查阅相关资料,进程间通信共有六种方式,下面我们一一进行介绍。

方式一:管道(pipe)

管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用。进程的亲缘关系通常是指父子进程关系。

匿名管道

在内核中申请一块固定大小的缓冲区,程序拥有写入和读取的权利,一般使用fork函数实现父子进程的通信。

命名管道

在内核中申请一块固定大小的缓冲区,程序拥有写入和读取的权利,没有血缘关系的进程也可以进程间通信。

特点

  1. 面向字节流;

  2. 生命周期随内核;

  3. 自带同步互斥机制;

  4. 半双工,单向通信,两个管道实现双向通信。

方式二:消息队列(MessageQueue)

在内核中创建一队列,队列中每个元素是一个数据报,不同的进程可以通过句柄去访问这个队列。消息队列提供了⼀个从⼀个进程向另外⼀个进程发送⼀块数据的方法。每个数据块都被认为是有⼀个类型,接收者进程接收的数据块可以有不同的类型值。

消息队列是由消息的链表,存放在内核中并由消息队列标识符标识。消息队列克服了信号传递信息少、管道只能承载无格式字节流以及缓冲区大小受限等缺点。

消息队列也有管道⼀样的不足就是每个消息的最大长度是有上限的。

特点

  1. 消息队列可以认为是一个全局的一个链表,链表节点钟存放着数据报的类型和内容,有消息队列的标识符进行标记;

  2. 消息队列允许一个或多个进程写入或者读取消息;

  3. 消息队列的生命周期随内核;

  4. 消息队列可实现双向通信。

方式三:信号量(Semaphore)

信号量是一个计数器,可以用来控制多个进程对共享资源的访问。它常作为一种锁机制,防止某进程正在访问共享资源时,其他进程也访问该资源。因此,主要作为进程间以及同一进程内不同线程之间的同步手段。

在内核中创建一个信号量集合(本质是个数组),数组的元素(信号量)都是1,使用P操作进行-1,使用V操作+1。

PV操作用于同一进程,实现互斥。

PV操作用于不同进程,实现同步。

PV操作是原子操作。

方式四:共享内存(SharedMemory)

将同一块物理内存一块映射到不同的进程的虚拟地址空间中,实现不同进程间对同一资源的共享。

共享内存可以说是最有用的进程间通信方式,也是最快的IPC形式,往往与其他通信机制,如信号量配合使用,来实现进程间的同步和通信。

方式五:套接字(socket)

套接字(socket)也是一种进程间通信机制,与其他通信机制不同的是,它可用于不同机器间的进程通信。

方式六:信号(signal)

信号是一种比较复杂的通信方式,用于通知接收进程某个事件已经发生。

总结

进程之间通信的方式共有六种,分别是管道、消息队列、信号量、共享内存、套接字、信号。

参考资料

进程间通信和线程间通信的几种方式

进程间通信有哪几种方式

进程间通信的方式——信号、管道、消息队列、共享内存

linux六大进程间通信方式