一、进程间通信方式有八种:
1. 管道Pipe
2. 命名管道FIFO
3. 内存映射Memory Mapping
4. 消息队列Message Queue
5. 共享存储Shared Memory
6. 信号量Semaphore
7. 套接字Socket
8. 信号Signal
二、简单介绍如下:
1. 管道pipe
管道,又称为匿名管道,是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用。
主要用于父进程和子进程间的通信,一般不用匿名管道做进程间通信。
2. 命名管道FIFO
有名管道也是半双工的通信方式,但是它允许无亲缘关系进程间的通信,用于同一台机器上的任意两个进程间的通信。
推荐使用,和socket相比,不占用端口号,虽然也支持不同机器通信,但一般只用于本机进程通信,支持数据双向或单向传输。
3. 内存映射MemoryMapping
适用于共享数据的情况,与管道和socket相比,缺点是不能被动得到通知,只能主动去访问共享数据。假如有A,B两个进程,A修改或读取共享内存的数据,B并不能知道,B只能通过自己主动去访问共享内存,得知数据变化。而管道和socket,A可以向B发送数据,B能够立即知道,反过来也一样。
4. 消息队列MessageQueue
消息队列是由消息的链表,存放在内核中并由消息队列标识符标识。消息队列克服了信号传递信息少、管道只能承载无格式字节流以及缓冲区大小受限等缺点。
消息队列用于运行于同一台机器上的进程间通信,它和管道很相似,是一个在系统内核中用来保存消息的队列,它在系统内核中是以消息链表的形式出现。消息链表中节点的结构用msg声明。
事实上,它是一种正逐渐被淘汰的通信方式,我们可以用流管道或者套接口的方式来取代它。
5. 共享内存SharedMemory
共享内存是运行在同一台机器上的进程间通信最快的方式,因为数据不需要在不同的进程间复制。通常由一个进程创建一块共享内存区,其余进程对这块内存区进行 读写。得到共享内存有两种方式:映射/dev/mem设备和内存映像文件。前一种方式不给系统带来额外的开销,但在现实中并不常用,因为它控制存取的将是 实际的物理内存,在Linux系统下,这只有通过限制Linux系统存取的内存才可以做到,这当然不太实际。常用的方式是通过shmXXX函数族来实现利 用共享内存进行存储的。
共享内存就是映射一段能被其他进程所访问的内存,这段共享内存由一个进程创建,但多个进程都可以访问。共享内存是最快的 IPC 方式,它是针对其他进程间通信方式运行效率低而专门设计的。它往往与其他通信机制,如信号量,配合使用,来实现进程间的同步和通信。
6. 信号量Semaphore
信号量又称为信号灯,它是用来协调不同进程间的数据对象的,而最主要的应用是前一节的共享内存方式的进程间通信。本质上,信号量是一个计数器,它用来记录对某个资源(如共享内存)的存取状况。
信号量是一个计数器,可以用来控制多个进程对共享资源的访问。它常作为一种锁机制,防止某进程正在访问共享资源时,其他进程也访问该资源。因此,主要作为进程间以及同一进程内不同线程之间的同步手段。
7. 套接字Socket
套解字也是一种进程间通信机制,与其他通信机制不同的是,它可用于不同及其间的进程通信。和管道相比,缺点是占用端口号,优点是适合不同机器间通信,最常见的例子就是远程控制工具。
套接字(socket)编程是实现Linux系统和其他大多数操作系统中进程间通信的主要方式之一。我们熟知的WWW服务、FTP服务、TELNET服务 等都是基于套接字编程来实现的。除了在异地的计算机进程间以外,套接口同样适用于本地同一台计算机内部的进程间通信。
8. 信号
信号是一种比较复杂的通信方式,用于通知接收进程某个事件已经发生。