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

文章目录

  • 创建进程的方法
    • 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.mfbz.cn/a/414671.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

osi模型,tcp/ip模型(名字由来+各层介绍+中间设备介绍)

目录 网络协议如何分层 引入 osi模型 tcp/ip模型 引入 命名由来 介绍 物理层 数据链路层 网络层 传输层 应用层 中间设备 网络协议如何分层 引入 我们已经知道了网络协议是层状结构,接下来就来了解了解下网络协议如何分层 常见的网络协议分层模型是OSI模型 和 …

Sentinel实战(待完善)

目录 服务雪崩 什么是服务雪崩 服务不可用原因 解决方案 技术选型对比 Sentinel 介绍 优点 核心概念 资源 规则 代码实战 API实现 SentinelResource注解埋点实现 服务雪崩 什么是服务雪崩 在服务调用链路中, 服务提供者不可用, 导致服务调用者不可用, 间接让上上游…

C++——类的6个默认成员函数

目录 类中的6个默认成员函数 构造函数 构造函数的特点 初始化列表 隐式类型转换 析构函数 拷贝构造函数 赋值重载 运算符重载 赋值重载 取地址重载 类中的6个默认成员函数 类中的6个默认成员函数根据不同的作用可以分为: 初始化和使用后清理:…

【vue】什么是虚拟Dom,怎么实现虚拟DOM,虚拟DOM一定更快吗

什么是虚拟Dom 虚拟 DOM 基于虚拟节点 VNode,VNode 本质上是一个对象,VDOM 就是VNode 组成的 废话,js 中所有的东西都是对象 虚拟DOM 为什么快,做了哪些优化 批量更新 多个DOM合并更新减少浏览器的重排和重绘局部更新 通过新VDO…

基于springboot+vue的保险信息网站(源码+论文)

文章目录 文章目录 前言 一、功能设计 二、功能实现 2.1 前台功能设计 2.1.1 网站首页 2.1.2 保险产品列表 2.1.3 留言板界面 2.1.4 产品查询界面 2.2后台管理设计 2.2.1 系统用户登录管理 三、库表设计 四、论文 前言 随着互联网的不断发展,现在人们获…

使用空闲电脑免费搭建一个私人的网盘

如果你也有一台空闲电脑,可以使用它来搭建一个私人的网盘。 这里使用的是飞梦云网盘; 服务端:下载 服务器文件使用hash校验进行储存,实现重复上传的文件秒传功能。 Fuse4Ui(虚拟分区工具):下…

手撕Java集合之简易版Deque(LinkedList)

在目前,许多互联网公司的面试已经要求能手撕集合源码,集合源码本身算是源码里比较简单的一部分,但是要在面试极短的10来分钟内快速写出一个简易版的源码还是比较麻烦的,很容易出现各种小问题。所以在平时就要注重这方面的联系。 以…

Java 小项目开发日记 01(注册接口的开发)

Java 小项目开发日记 01&#xff08;注册接口的开发&#xff09; 1.项目需求 完成注册接口 2.项目目录 3. 配置文件&#xff08;pom.xml&#xff09; <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-insta…

shader学习记录——融合、融球效果

融合、融球效果shader&#xff0c;重点在等势面公式上 Shader "Custom/MetaballsShader" {Properties{_MainTex ("Texture", 2D) "white" {}_Color("Color",Color) (1,1,1,1)}SubShader{Tags { "RenderType""Opaque…

(PWM呼吸灯)合泰开发板HT66F2390-----点灯大师

前言 上一篇文章相信大家已经成为了点灯高手了&#xff0c;那么进阶就是成为点灯大师 实现PWM呼吸灯 接下来就是直接的代码讲解了&#xff0c;不再讲PWM原理的 这里部分内容参考了另一个博主的文章 合泰杯——合泰单片机工程7之PWM输出 如果有小伙伴不理解引脚设置和delay函数…

【C++干货基地】C++:函数重载(深度解析Windows和Linux下函数的修饰规则)

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 引入 哈喽各位铁汁们好啊&#xff0c;我是博主鸽芷咕《C干货基地》是由我的襄阳家乡零食基地有感而发&#xff0c;不知道各位的…

数据分析案例-社交媒体情绪数据集可视化分析(文末送书)

&#x1f935;‍♂️ 个人主页&#xff1a;艾派森的个人主页 ✍&#x1f3fb;作者简介&#xff1a;Python学习者 &#x1f40b; 希望大家多多支持&#xff0c;我们一起进步&#xff01;&#x1f604; 如果文章对你有帮助的话&#xff0c; 欢迎评论 &#x1f4ac;点赞&#x1f4…

C++-带你走进多态(1)

1. 多态的概念 1.1 概念 多态的概念&#xff1a;通俗来说&#xff0c;就是多种形态&#xff0c;具体点就是去完成某个行为&#xff0c;当不同的对象去完成时会产生出不同的状态。 举个栗子&#xff1a;比如买票这个行为&#xff0c;当普通人买票时&#xff0c;是全价买票&am…

Win10系统C盘突然爆满的解决方法

在Win10电脑操作中&#xff0c;用户发现系统C盘突然爆满了&#xff0c;电脑运作变得卡顿&#xff0c;非常影响自己的使用体验&#xff0c;但不知道怎么操作才可以解决问题&#xff1f;接下来小编给大家带来Win10系统C盘突然爆满的解决方法&#xff0c;帮助大家解决问题&#xf…

qt5与qt6的cmake区别

文章目录 使用cmake构建qt项目&#xff0c;坑很多。一是本身就麻烦&#xff0c;二是&#xff0c;确实坑&#xff0c;因为不同的qtcreator版本&#xff0c;选了不同的kits&#xff08;套件&#xff09; 生成的CMakeList.txt文件也不一样。 如果可以的话都选择Qt6的相关选项&…

135 Linux 系统编程11 ,linux命令重定向,dup 和dup2,fcntl实现dup ,进程和程序,虚拟内存和物理内存映射关系,pcb进程块详解

一 linux 命令中重定向&#xff0c;使用>实现 通过 大于号 将前面的内容写入到某一个地方 cat main.c > b.txt //cat main 本身的意思是 显示main.c的值&#xff0c;后面加上 > b.txt 会将显示在屏幕上的字符全部写到b.txt中 例子&#xff1a;将 ls -l 的内容 通…

基于springboot实现二次元商品购物系统项目【项目源码+论文说明】

基于springboot实现二次元商品购物系统演示 摘要 时代的变化速度实在超出人类的所料&#xff0c;21世纪&#xff0c;计算机已经发展到各行各业&#xff0c;各个地区&#xff0c;它的载体媒介-计算机&#xff0c;大众称之为的电脑&#xff0c;是一种特高速的科学仪器&#xff0…

RV32/64 特权架构 - 特权模式与指令

RV32/64 特权架构 - 特权模式与指令 1 特权模式2 特权指令2.1 mret&#xff08;从机器模式返回到先前的模式&#xff09;2.2 sret&#xff08;从监管模式返回到先前的模式&#xff09;2.3 wfi&#xff08;等待中断&#xff09;2.4 sfence.vma&#xff08;内存屏障&#xff09; …

什么是负载均衡集群?

目录 1、集群是什么&#xff1f; 2、负载均衡集群技术 3、负载均衡集群技术的实现 4、实现效果如图 5、负载均衡分类 6、四层负载均衡&#xff08;基于IP端口的负载均衡&#xff09; 7、七层的负载均衡&#xff08;基于虚拟的URL或主机IP的负载均衡) 8、四层负载与七层…

C语言————结构体

接下来我们来了解C语言中很重要的内容&#xff1a;结构体。虽然到现在我们可以创建常量&#xff0c;变量&#xff0c;数组&#xff0c;但是存储的都是相同类型的数据&#xff0c;如果我们需要写入不同数据类型的信息怎么办&#xff0c;例如常见的身份证上的信息&#xff0c;有身…