进程是一个独立的资源分配单元,不同进程(主要是指不同的用户进程)之间的资源是独立的,没有关联的,不能在一个进程中直接访问另一个进程的资源。但是,进程不是孤立的,如我和你用qq聊天、或迅雷下载资源都需要不同的资源进行通信。这就需要不同进程之间进行信息的交互和状态的传递等,因此这就需要进程间的通信。
进程通信主要有以下几种目的:
同一主机进程间通信方式主要有:匿名管道、有名管道、信号、消息队列、共享内存、内存映射、信号量。
不同主机之间进程通信方式主要有:Socket。
管道的特点:
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RYd0qIUE-1659346554493)(C:\Users\ThinkStation K\AppData\Roaming\Typora\typora-user-images\1659338210747.png)]](https://1000bd.com/contentImg/2022/08/03/220440081.png)
①匿名管道通信示意图
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gdAIsz8N-1659346554494)(C:\Users\ThinkStation K\AppData\Roaming\Typora\typora-user-images\1659340120452.png)]](https://1000bd.com/contentImg/2022/08/03/220440378.png)
②有名管道通信示意图
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0DYPlCVo-1659346554494)(C:\Users\ThinkStation K\AppData\Roaming\Typora\typora-user-images\1659341359340.png)]](https://1000bd.com/contentImg/2022/08/03/220440669.png)
内存映射是将磁盘文件的数据映射到内存,用户通过修改内存就能修改磁盘文件。
①内存映射示意图

②用内存映射来实现通信示意图
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ekBg7mqr-1659346554495)(C:\Users\ThinkStation K\AppData\Roaming\Typora\typora-user-images\1659342217048.png)]](https://1000bd.com/contentImg/2022/08/03/220441373.png)
共享内存允许两个或多个共享物理内存的同一块区域(通常被称为段)。由于一个共享内存段会被称为一个进程用户空间中的一部分,因此这种IPC机制无需内核接入。所有需要做的就是让一个进程将数据复制进共享内存中,并且这部分数据会对其他所有共享同一个段的进程可用。
与管道等要求发送进程将数据从用户空间的缓冲区复制进内核内存和接收进程将数据从内核内存复制进用用户空间的缓冲区相比,这种IPC技术的速度更快。无需内核介入,通信速度最快。
共享内存和内存映射的区别
1.共享内存可以直接创建,内存映射需要磁盘文件(匿名映射除外)
2.共享内存效率更高
3.内存
所有的进程操作的是同一个共享内存。(类似于类中的static成员变量)。
内存映射,每个进程在自己的虚拟地址中有一块独立的内存
4.数据安全问题
-进程突然退出
共享内存还存在
内存映射去小时
-运行进程的电脑死机
数据存在共享内存中,没有了
内存映射区的数据,由于磁盘文件中的数据还在,所以内存映射区的数据还存在
5.生命周期
-内存映射区:进程退出,内存映射区销毁
-共享内存:进程退出,共享内存还在,标记删除(所有的关联进程数为0),或者关机如果一个进程退出,会自动和共享内存取消关联(类似于shared_ptr)
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xHirb8Tl-1659346554495)(C:\Users\ThinkStation K\AppData\Roaming\Typora\typora-user-images\1659345084665.png)]](https://1000bd.com/contentImg/2022/08/03/220441640.png)
信号是Linux进程间通信最古老的方式之一,是在事件发生时对进程的通知机制,有时也称为软件中断,它是在软件层次上对中断机制的一种模拟,是一种异步通信方式。信号可以导致一个正在运行的进程被另一个正在运行的异步进程中中断,转而处理某一个突发事件。
①信号的两个主要目的:
②信号的特点:
③重要的信号:
![- [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Fv7ox4R5-1659346554495)(C:\Users\ThinkStation K\AppData\Roaming\Typora\typora-user-images\1659345967190.png)]](https://1000bd.com/contentImg/2022/08/03/220441932.png)
Qt中的信号与槽就是根据信号来实现。