进程间通信之共享内存

马谦马谦马谦 C/C++评论258字数 590阅读 1 分 58 秒阅读模式

共享内存是所有 IPC 通信中效率最高的,它通过把文件映射到用户进程空间,然后直接通过地址访问来实现多进程通信。相对于其他 IPC 通信方式而言,少去了把数据从用户空间复制到内核空间,再从内核空间复制到用户空间的过程,因此效率相当高。

用图形来表示就是:

进程间通信之共享内存-图片1

操作共享内存的函数:

第一个是映射共享内存的函数,参数说明:

  1. addr: 需要映射的共享内存起始地址,一般来说传入 NULL 。
  2. len: 映射出来的共享内存块大小。
  3. prot: 内存权限,长用的权限是 PROT_READ | PROT_WRITE,表示可读可写。
  4. flags: 共享内存区域的属性,可以设置为 MAP_SHARED 或者 MAP_PRIVATE,如果是前者,当前进程对共享内存区域的修改对其他进程可见,否则就不可见。
  5. fd: 共享内存文件的文件描述符。
  6. offset: 文件的偏移,从文件的 offset 处开始共享内存。

使用示例

以下代码展示了一个共享内存的操作示例,通过共享内存在父子进程间共享一个 int 类型的变量,然后父进程修改值,子进程读:

代码中忽略掉了一些不相关的错误处理。

代码中信号量的作用是确保子进程在父进程执行完成后才执行,父进程先把共享内存的数据加 1,然后子进程读取共享内存的数据应该要变成 12346 。

执行结果符合预期:

进程间通信之共享内存-图片2

 
马谦马谦马谦
  • 本文由 马谦马谦马谦 发表于 2020 年 2 月 23 日 14:48:28
  • 转载请务必保留本文链接:https://www.dyxmq.cn/program/code/c-cpp/shared-memory-in-unix-c.html
C++文件输入输出流fstream的基本用法 C/C++

C++文件输入输出流 fstream 的基本用法

一、文件流 C++的 IO 类中定义了三个文件读写流 fstream 、 ifstream 以及 ofstream,它们都继承于相同的父类 istream,通过不同的实现以实现不同的文件流操作。 三者的区别为: if...
C++11中const_cast的真实使用场景 C/C++

C++11 中 const_cast 的真实使用场景

一、 const 和成员函数的故事 const 的用途有以下几种: 修饰全局、局部、成员变量 修饰成员函数 修饰变量的时候 const 限制了变量在整个程序运行期间都是不能修改的,而修饰成员函数的时候限制函数内...
C++11中的override和final关键字 C/C++

C++11 中的 override 和 final 关键字

一、前言 昨天在公司做代码扫描,发现很多类似以下的代码都产生了告警,导致扫描不通过: virtual int func() override {} 不通过的原因是:同时使用 virtual 和 overri...
匿名

发表评论

匿名网友
:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:
确定

拖动滑块以完成验证