前言
经常被问到进程间通信的方式,这个可以答上来,但是问了一下各个通信方式的使用场景,就不清楚了。
这里对进程间通信(IPC,InterProcess Communication)做一个简单的记录
IPC方式
管道通信
无名管道
半双工,只能在具有公共祖先的两个进程之间使用(例如父子进程)。
有名管道(FIFO)
可以在不相关的程序之间交换数据。
FIFO其实是一种文件类型。
FIFO主要有两种用途:
· shell命令使用FIFO将数据从一条管道传送到另一条管道时,无须创建中间的临时文件。
· 客户进程-服务器进程应用程序中,FIFO用作汇聚点,在客户进程和服务器进程二者之间传递数据。
信号
信号是进程间唯一的一种异步通信方式,进程要使用异步通信那就用它。
信号只能传递简单的信息,太过复杂的无法做到。
信号量:主要是用来保护共享资源,使得资源在一个时刻只有一个进程(线程)所拥有。
消息队列
消息的链接表,存放在内存中,由内核维护,有消息队列标识符标志。
共享内存
允许两个或多个进程共享一个给定的存储区。
速度最快的IPC
共享内存并未提供同步机制,也就是说,在第一个进程结束对共享内存的写操作之前,并无自动机制可以阻止第二个进程开始对它进行读取,所以我们通常需要用其他的机制来同步对共享内存的访问,例如信号量。
套接字socket
主要用在不同主机间进程的通信