进程通信的主要目的在于交换信息。在 linux 系统中进程间通信的主要实现方式有:信号 、 消息队列 、 共享内存 、 socket 、 管道 、 信号量等方式实现了进程间的通信。
在 linux 系统中由于各个进程的运行是相互独立的,这种独立性决定了各个进程间是无法直接进行通信,无法直接交换信息。这也决定了计算机进程间要想实现交互不得不借助外部的力量,在实际使用中 linux 通过引入:信号 、 消息队列 、 共享内存 、 socket 、 管道 、 信号量等方式确保了进程间通信的实现。本文也将对这些实现方式做一个简单的介绍。
信号
信号主要用于线程间以及同一线程间同步的手段,用于通知接受进程某个时间的发生。信号通常作为一种标识,能够承载的信息极少也极为单一。
消息队列
消息队列的一般定义为:消息传输过程中存储消息的容器。
这里所说的消息队列区别于应用型的消息队列,一般提到消息队列我们总想起的是应用型的消息队列如 kafka,redis、rabbitmq 等消息队列的实现,此处说的消息队列是基于 linux 内核实现的一种消息链表。它克服了信号所能承载信息量少,管道只能承载无格式字节流且缓冲区大小受限等缺点。
共享内存
共享内存的实现方法为在内存中开辟一个能够被其他进程缩放问的内存,它通常由一个进程创建多个进程进行访问,它是最快的进程间通信方式(ipc),通常与其他的通信机制相结合,如结合信号量使用,来达到进程间的同步及互斥的目的。
socket(套接字)
socket(套接字)是一种更为普遍使用的通信机制,不同的是 socket 不仅可以使用与进程间的通信也可以使用与不同应用、不同机器间的通信。
管道
管道属于半双工的通信方式,数据流只能单向流动。 通过管道通信过程中,发送信息的进程被称为写进程,接收信息的进程被称为被称为读进程。二者通过读写管道介质(文件)的形式完成进程间的通信。
无名管道
无名管道是一种半双工的通信方式,而且通信双方仅限于具有亲缘关系的进程间通信(父子进程)。
命名管道
命名管道也属于半双工的通信方式,但是他允许不具有亲缘关系的双方间进行通信。
信号量
信号量是一个计数器,实际相当于一个标识用来控制多个进程对共享资源的访问。它常作为一种锁机制,防止某进程正在访问共享资源时,其他进程也访问该资源,同时进程也可以对他进行修改。因此,主要作为进程间以及同一进程内不同线程之间的同步手段。