Linux进程间的通信机制通常被称为Inter-Process communication, IPC,分为信号 Signals, 管道 Pipe, 共享内存 Shared memory, 先入先出队列 FIFO,消息队列 Message queue,套接字 Socket。
信号Signal
信号是UNIX系统最先开始使用的进程间通信机制,通过向一个或多个进程发送异步事件信号来实现。可以在Linux系统上输入kill -l来列出系统使用的信号。一部分的信号量可以被程序捕获并设定相应的处理函数。
管道 Pipe
Linux系统中的进程可以通过建立管道pipe进行通信,在两个进程之间,可以建立一个通道,一个进程向这个通道里写入字节流,另一个进程从这个管道中读取字节流。包括无名管道与命名管道。
共享内存 shared memory
两个进程之间还可以通过共享内存进行进程间通信,其中两个或者多个进程可以访问公共内存空间。两个进程的共享工作是通过共享内存完成的,一个进程所作的修改可以对另一个进程可见(很像线程间的通信)。
使用共享内存前,需要经过一系列的调用流程,如下:
1、创建共享内存段或者使用已创建的共享内存段(shmget())
2、将进程附加到已经创建的内存段中(shmat())
3、从已连接的共享内存段分离进程(shmdt())
4、对共享内存段执行控制操作(shmctl())
具体用例参考csdn链接
先入先出队列FIFO
先入先出队列FIFO通常被称为 命名管道 命名管道的工作方式与常规管道非常相似。未命名的管道没有备份文件:操作系统负责维护内存中的缓冲区,用来将字节从写入器传输到读取器。一旦写入或者输出终止的话,缓冲区将被回收,传输的数据会丢失。相比之下,命名管道具有支持文件和独特 API ,命名管道在文件系统中作为设备的专用文件存在。当所有的进程通信完成后,命名管道将保留在文件系统中以备后用。命名管道具有严格的 FIFO 行为。
消息队列 Message Queue
消息队列 是用来描述内核寻址空间的内部链接列表,可以按照几种不同的方式将消息按照顺序发送到队列并从队列中检索消息。每个消息队列由IPC标识符唯一标识。消息队列有两种模式,一种是严格模式,消息顺序发送,顺序读取。还有一种模式是非严格模式,消息的顺序性不是非常重要。参考https://www.jianshu.com/p/19a94c1c729b
套接字 Socket
Socket提供端到端的双向通信。一个Socket可以与一个或多个进程关联。套接字一般用于两个进程之间的网络通信,网络Socket需要注入 TCP 或 UDP 基础协议的支持。
Socket有以下几种分类:
1、Sequential Packet Socket:为最大长度固定的数据提供可靠的连接。此连接是双向的并且是顺序的。
2、Datagram Socket:接受消息的顺序与发送者可能不同。
3、Stream Socket:工作方式类似于电话对话,提供双向可靠的数据流。
4、Raw Socket:可以使用其访问基础通信协议。