IPC即Inter-Process Communication,进程间通信,准确的来说IPC是用于实现不同进程中的线程之间的通信。注意进程间通信和(同一个进程中的)线程间通信是有区别的,一个进程中的所有线程都在同一个寻址空间,可以直接使用全局变量(包含信号量、消息队列等)进行通信,而不同进程拥有不同的内存映射空间,所以不同进程中的线程是无法直接进行通信的。
来个应用场景举例。
打开两个应用:浏览器和迅雷下载器,在网页上浏览一个下载链接,点击下载,会直接跳转到迅雷下载器中进行下载。很显然浏览器和迅雷是两个不同的进程,在浏览器上操作,会反应到迅雷上,这就是典型的进程间通信的例子。
Linux上的实现IPC有多种方式:
(1) 半双工Unix管道
(2) FIFOs(命名管道)
(3) 消息队列
(4) 信号量
(5) 共享内存
(6) 网络Socket
执行命令 ipcs 查看系统当前IPC通道信息:
root@OrangePI:/samba_root/OrangePi_CedarX/cedarx# ipcs
------ Message Queues --------
key msqid owner perms used-bytes messages
------ Shared Memory Segments --------
key shmid owner perms bytes nattch status
0x00000000 98304 lightdm 600 524288 2 dest
0x00000000 131073 lightdm 600 33554432 2 dest
------ Semaphore Arrays --------
key semid owner perms nsems
这里显示了三种分别是消息队列、共享内存、信号量,这也是使用较多的三种IPC方式。一个 IPC 至少包含 key值、ID值、拥有者、权限和使用的大小等关键信息。如果需要手工删除某个 IPC 机制,可以使用 ipcrm 命令。
Linux下的IPC程序设计参考文章:
Linux进程间通信——使用命名管道:https://blog.csdn.net/ljianhui/article/details/10202699
Linux进程间通信——使用信号量:https://blog.csdn.net/ljianhui/article/details/10243617
Linux进程间通信——使用共享内存:https://blog.csdn.net/ljianhui/article/details/10253345
Linux进程间通信——使用消息队列:https://blog.csdn.net/ljianhui/article/details/10287879
Linux进程间通信——使用流套接字(TCP):https://blog.csdn.net/ljianhui/article/details/10477427
Linux进程间通信——使用数据报套接字(UDP):https://blog.csdn.net/ljianhui/article/details/10697935