进程间通信的方式有5种,分别是管道,消息队列,信号量,共享内存,以及socket。前四种方式是针对同一主机下的进程间通信,最后一种是不同主机见的进程间通信方式。
管道
管道为进程间通信提供了一个单向的渠道,是一个半双工通信方式。管道可读可写,一端用于读,另一端用于写。
无名管道针对父子进程之间的进程间通信,假设父进程写管道,子进程读管道,那么在父进程中需要记得将读端关闭,子进程中需要记得将写端关闭,因为父进程的读端和子进程的写端都是无效的。
有名管道(FIFO)针对不同进程之间的进程间通信,不局限于父子进程。
有名管道的特点:
1,可以实现两个不相关进程之间的通信。
2,可以基于文件系统,将有名管道视作文件的读写。
3,遵循FIFO,在首端读,在尾端写。
消息队列
正面临淘汰,忽略
共享内存
共享内存的提出是基于提高进程间通信的效率,即不通过内核而直接实现用户下的进程与进程之间的通信。共享内存实际上是建立了进程的虚拟内存到物理内存的映射关系,这层映射关系通过共享内存可以使得不同的进程的虚拟内存映射到同一块物理内存。当一个进程向共享内存写的时候,会影响访问另一个访问共享内存的进程。共享内存是进程通信中速度最快的,但它没有提供同步机制,即在一个进程对共享内存写的时候不能阻止另一个进程对它读,因此需要其他的机制对共享内存进行同步。
信号量
共享内存解决不了进程同步,而信号量可以解决进程同步的问题。信号量允许多个进程同时进入临界区。(回想多线程同步的几种方法:互斥锁、条件变量、读写锁、信号量)。一般会配合共享内存和信号量处理进程间通信问题。