[多进程] 进程间通信-笔记

文章目录

  • 创建进程的方法
    • Linux
      • fork
      • exec
      • system
    • Windows
      • createprocess
      • shellexecute
      • system
  • 进程间通信方法
    • 管道(Pipe)
      • 管道的种类
      • 特点
    • 通过文件通信
    • 内存映射(文件映射)
      • 匿名映射
    • 共享内存 + 信号量(或者锁)
    • 消息队列
      • Windows消息队列
      • Linux消息队列
    • 信号
    • Socket

创建进程的方法

Linux

fork

使用fork()函数,可以创建子进程,子进程复制父进程的虚拟内存。和父进程共享代码。
fork()在父进程中返回子进程ID,在子进程中返回0,执行错误返回-1。
Linux c/c++之进程的创建

exec

exec函数簇,在子进程占用调用相关函数可以进行进程替换。
即从调用exec开始,子进程就替换成exec调用的进程,而原本的子进程代码将不再执行。

system

system系统调用可以启动一个新的进程,但是父进程会挂起,等待新的进程结束。

Windows

createprocess

windows中没有fork()。
windows中一般通过CreateProcess()函数调用一个执行的可执行程序,来启动一个新的进程,父进程不需要等待子进程结束。
看到网上有在windows中模拟fork()的方法,还没看过。
windows下创建进程,CreateProcess()详解及用法

shellexecute

shellexecute 可以启动一个新的进程,父进程不需要等待子进程结束。它支持文件关联,即不指定notepad, 直接让他打开一个txt文件,它也会用notepad(或者其他关联的程序)打开。
例如:

ShellExecuteA(NULL, "open", "D:\\text.txt", NULL, NULL, SW_SHOWNORMAL);

ShellExecute详细用法

system

system系统调用可以启动一个新的进程,但是父进程会挂起,等待新的进程结束。

进程间通信方法

管道(Pipe)

管道的种类

  1. 无名管道(通常就叫管道) Pipe
  2. 命名管道 FIFO-Pipe

特点

  • windows和linux都支持管道。
  • 无名管道用于父子进程之间。
  • 命名管道可以用于不相关的进程间的通信。
  • 管道是半双工的
  • 管道的可以设置阻塞和非阻塞

阻塞:
一个为只读而打开一个管道的进程会阻塞,直到另一个进程为只写打开管道
一个为只写而打开一个管道的进程会阻塞,直到另一个进程为只读打开管道
read()/write()也是阻塞的

非阻塞
以只读方式打开FIFO,如果没有进程为写而打开FIFO, 只读open成功,并且open不阻塞
以只写方式打开FIFO, 如果没有进程为读而打开FIFO,只写open将出错返回-1 (ENXIO: No Such device or address)
read()/write()也是阻塞的

无论是否阻塞,像一个读端关闭的管道写入数据会产生SIGPIPE错误

参考:
C++项目实战-多进程(一篇文章)
命名管道的阻塞和非阻塞模式的初步探讨

通过文件通信

可以通过新建一个文件,然后一个进程向里面写,一个进程从里面读。
其实这和管道思想类似。
参考:C++项目实战-多进程(一篇文章)

内存映射(文件映射)

内存映射就是通过内核把一个磁盘文件映射到进程的虚拟内存中。进程可以通过指针来访问映射的文件内存,对文件进行修改,内核会负责把修改同步回磁盘文件。

  • Windows和Linux都支持文件映射
  • 文件映射可以用于父子进程之间,也可以用于不相关进程,用于父子进程之间,只需要在fork()之前映射一次就行,因为子进程会拷贝父进程的虚拟内存;用于不相关进程之间,需要两个进程都进行映射。
  • 进行文件映射时,需要先打开文件,获取文件描述符,文件映射开始后,文件描述符随时可以close。
  • 如果用于进程间通信,必须设置文件映射为共享的,Linux选项是MAP_SHARED
  • 使用文件映射也存在谁读谁写的问题,它也不是全双工的

匿名映射

就是不指定文件描述符的映射,类似于管道和命名管道的区别,匿名映射只能用于父子进程之间。

参考:
C++项目实战-多进程(一篇文章)
[内存] windows 实现内存映射

共享内存 + 信号量(或者锁)

共享内存是一种进程间的通信机制,并且也是最底层的一种机制(其他的通信机制还有管道,消息队列等)。
进程之间通过访问一块共享的空间,来进行数据的通信(交换)。具体来讲,就是将一份物理内存映射到不同进程各自的虚拟地址空间,这样每个进程都可以读写这片相同的物理内存。
共享内存是速度最快的一种进程间通信(IPC)方式,它直接对内存进行存取,比操作系统提供的读写系统服务更快。
由上面的描述我们发现,当多个进程对同一片空间进行读写时必然会出现同步的问题,所以一般共享内存会和信号量或者锁机制一同使用,保证数据的一致性。

  • Windows和Linux都支持
  • Windows中共享内存和内存映射的调用API基本一样,都有CreateFileMapping()和MapViewOfFile(),根据下面参考文章,可以看出原理是差不多的,内存映射多了磁盘映射到物理内存这一步。
  • 参照内存映射,共享内存也可以用于父子进程或者非父子进程。
  • 共享内存是高效的进程间通信方法。

参考:
【学习笔记】windows 下的 shared memory(共享内存)原理与实践
C++项目实战-多进程(一篇文章)

消息队列

Windows消息队列

  • Windows中如果是窗口线程,是可以通过线程的消息队列进行IPC的,但是如果没有窗口线程,就没法用这个方法了,因为PostMessage函数需要窗口句柄。
  • Windows消息传递的参数是有限制的。(WParam和LParam都是32位整数)我感觉IPC中,Windows的消息只能传递消息本身,让接收端对不同消息产生不同处理。

进程间通信IPC-Windows消息

Linux消息队列

消息队列是由消息的链表,存放在内核中并由消息队列标识符标识。消息队列克服了信号传递信息少、管道只能承载无格式字节流以及缓冲区大小受限等缺点。
来源:https://segmentfault.com/a/1190000010739303

Linux中提供了不同进程中发送数据块的方法,就是消息队列。
消息队列的好处是,消息队列由系统运行,发送端和接收端不需要考虑消息的同步问题,只需要接收和发送就好了。

  • 消息队列是异步的。发送者和接收者不需要同时在线,它们可以独立地工作。这种方式提供了一种高效的通讯方式,特别是在高并发的环境中。
  • 当队列满时,发送者进程可能会被阻塞,直到队列中有足够的空间为止。
  • 消息队列的大小、每个消息的大小和消息队列的总大小都是由限制的。

参考:
Linux进程间通讯方式的深入对比与分析和权衡 - 泡沫o0的文章 - 知乎
【Linux】进程间通信(IPC)之消息队列详解及测试用例

信号

信号比较麻烦,我也没用过,直接参考以下文章:

参考:
C++项目实战-信号
信号集(未决信号集,阻塞信号集)

Socket

通过本地Socket来进行IPC,本地Sockset和通常的网络Socket设置有点不同,参考以下文章。
参考:
Linux进程间通信方式–本地socket

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/707669.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

finedance 测试笔记

目录 依赖库: 预测流程: 音乐wav切割120帧 general_all.py改进 smplx 学习笔记: 依赖库: import pickle5 as picklepypi尚pickle5最高python版本3.7: pickle5 PyPI 解决方法,改为 import pickle …

cpp基础学习笔记01

C和C的区别 1.语言类型:C 是一种过程性编程语言,着重于以函数为基础的结构化编程;而 C 是一种多范式编程语言,支持面向对象编程(OOP)和泛型编程等多种编程范式。 2.对象模型:C 支持类和对象的概…

switch其他知识点

1.default的位置在整体输出语句中,放哪都可以; 省略的话结果会不显示; 2.case穿透,还是比较好理解的,因为缺少break导致会把下面的也打印,结果是输出多个 3.switch新特性:是用->减号和大于…

Mysql <=> 安全等于

<> 安全等于&#xff0c;为NULL安全的等值比较运算符&#xff08;NULL-safe equal&#xff09;&#xff0c;该操作符作用类似“”。 区别为当符号两边出现NULL值时&#xff0c;操作符会返回NULL&#xff0c;而<>会返回1&#xff08;两边操作数都为NULL时&#xff…

柯桥会计培训学校,会计职称考试,考中级会计怎么证明工作年限?

中级会计考试是会计从业人员的重要考试之一&#xff0c;对于中级考生来说&#xff0c;工作年限证明是必不可少的一步。因此&#xff0c;在考中级会计之前&#xff0c;需要对如何证明工作年限进行了解和掌握。 为大家整理了工作年限证明相关信息&#xff0c;一起来看看吧~ 一、…

Rocky Linux 运维工具 ls

一、ls 的简介 ​​ls​ 用于列出当前目录下的文件和目录&#xff0c;以及它们的属性信息。通过 ​ls​命令可以查看文件名、文件大小、创建时间等信息&#xff0c;并方便用户浏览和管理文件。 二、ls 的参数说明 序号参数描述1-a显示所有文件&#xff0c;包括以 ​.​开头的…

java单元测试技巧

Test装饰器指定断言类型 在JUnit 4中&#xff0c;你可以使用expected属性在Test注解中声明期望的异常类型。如&#xff1a; Test(expected Exception.class) public void testSqlSessionFactoryBeanWithNullDataSource() throws Exception {

5G双域快网

目录 一、业务场景 二、三类技术方案 2.1、专用DNN方案 2.2、ULCL方案&#xff1a;通用/专用DNNULCL分流 2.3、 多DNN方案-定制终端无感分流方案 漫游场景 一、业务场景 初期双域专网业务可划分为三类业务场景&#xff0c;学校、政务、文旅等行业均已提出公/专网融合访问需…

Spring MVC HandlerAdapter原理解析

在Spring MVC框架中&#xff0c;HandlerAdapter&#xff08;处理器适配器&#xff09;是一个非常重要的组件&#xff0c;它负责调用处理器&#xff08;Handler&#xff09;来处理客户端的请求。HandlerAdapter在请求处理流程中起到了桥梁的作用&#xff0c;连接了DispatcherSer…

【DDD】学习笔记-领域驱动设计对持久化的影响

资源库的实现 如何重用资源库的实现&#xff0c;以及如何隔离领域层与基础设施层的持久化实现机制&#xff0c;具体的实现还要取决于开发者对 ORM 框架的选择。Hibernate、MyBatis、jOOQ 或者 Spring Data JPA&#xff08;当然也包括基于 .NET 的 Entity Framework、NHibernat…

Acwing周赛记录

很难得参加一次周赛hhhhh这次参加的是第144场周赛&#xff0c;一共有三道题 AcWing 5473. 简单数对推理 给定两个整数数对&#xff0c;每个数对都包含两个 1∼9 之间的不同整数。 这两个数对恰好包含一个公共数&#xff0c;即恰好有一个整数同时包含于这两个数对。 给定这两…

选择排序,冒泡排序,插入排序,快速排序及其优化

目录 1 选择排序 1.1 原理 1.2 具体步骤 1.3 代码实现 1.4 优化 2 冒泡排序 2.1 原理 2.2 具体步骤 2.3 代码实现 2.4 优化 3 插入排序 3.1 原理 3.2 具体步骤 3.3 代码实现 3.4 优化 4. 快速排序 4.1 原理 4.2 具体步骤 4.3 代码实现 4.4 优化 为了讲…

linux动态库加载相关

linux下动态库搜索规则 (1)编译目标代码时指定的动态库搜索路径,也就是RPATH&#xff1b; (2)环境变量LD_LIBRARY_PATH指定的动态库搜索路径&#xff1b; (3)配置文件/etc/ld.so.conf中指定的动态库搜索路径&#xff1b;配置完毕后需运行ldconfig命令生效&#xff1b; (4)默…

Linux课程四课---Linux开发环境的使用(vim编辑器的相关)

作者前言 &#x1f382; ✨✨✨✨✨✨&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f382; ​&#x1f382; 作者介绍&#xff1a; &#x1f382;&#x1f382; &#x1f382; &#x1f389;&#x1f389;&#x1f389…

【MySQL】内置函数 -- 详解

一、日期函数 日期&#xff1a;年月日时间&#xff1a;时分秒 1、获得年月日 2、获得时分秒 3、获得时间戳 4、在日期的基础上加日期 5、在日期的基础上减去时间 6、计算两个日期之间相差多少天 7、获得当前时间 ⚪练习 &#xff08;1&#xff09;记录生日 &#xff08;2&…

视频监控简史

安防系统中,视频监控始终是重头戏,是安防系统的核心。 目录 一、起步 二、模拟时代 三、数字时代 四、嵌入式存储 五、视频编码器 六、全数字化监控

Flask入门一(介绍、Flask安装、Flask运行方式及使用、虚拟环境、调试模式、配置文件、路由系统)

文章目录 一、Flask介绍二、Flask创建和运行1.安装2.快速使用3.Flask小知识4.flask的运行方式 三、Werkzeug介绍四、Jinja2介绍五、Click CLI 介绍六、Flask安装介绍watchdog使用python--dotenv使用&#xff08;操作环境变量&#xff09; 七、虚拟环境介绍Mac/linux创建虚拟环境…

家政按摩上门服务小程序搭建

家政按摩上门服务小程序支持技师入驻申请&#xff0c;用户可以通过在线下单预约家政服务&#xff0c;并根据距离、价格、销量好评度等条件进行筛选和选择。用户可以选择技师进行预约&#xff0c;并填写自己的服务地点和时间&#xff0c;享受上门服务。同时&#xff0c;技师也可…

【MySQL】_自连接与子查询、

目录 1. 自连接 2. 子查询&#xff08;嵌套查询&#xff09; 2.1 子查询分类 2.2 单行子查询示例1&#xff1a;查询不想毕业同学的同班同学 2.3 多行子查询示例2&#xff1a;查询语文或英语课程的信息成绩 3. 合并查询 3.1 示例1&#xff1a;查询id3或者名字为英文的课程…

数据分析-Pandas数据探查初步柱状图

数据分析-Pandas数据探查初步柱状图 数据分析和处理中&#xff0c;难免会遇到各种数据&#xff0c;那么数据呈现怎样的规律呢&#xff1f;不管金融数据&#xff0c;风控数据&#xff0c;营销数据等等&#xff0c;莫不如此。如何通过图示展示数据的规律&#xff1f; 数据表&am…