导读 共享内存是在内存中单独开辟的一段内存空间,这段内存空间有自己特有的数据结构,包括访问权限、大小和最近访问的时间等。

共享内存 IPC 原理

共享内存进程间通信机制主要用于实现进程间大量的数据传输,下图所示为进程间使用共享内存实现大量数据传输的示意图:

共享内存是在内存中单独开辟的一段内存空间,这段内存空间有自己特有的数据结构,包括访问权限、大小和最近访问的时间等。该数据结构定义如下:

两个进程在使用此共享内存空间之前,需要在进程地址空间与共享内存空间之间建立联系,即将共享内存空间挂载到进程中。

系统对共享内存做了以下限制:

#define SHMMAX 0x2000000 /* max shared seg size (bytes) 最大共享段大小 */

#define SHMMIN 1 /* min shared seg size (bytes) 最小共享段大小 */

#define SHMMNI 4096 /* max num of segs system wide */

#define SHMALL (SHMMAX/getpagesize()*(SHMMNI/16))|

define SHMSEG SHMMNI /* max shared segs per process */

Linux 共享内存管理

1.创建共享内存

#include <sys/ipc.h> #include <sys/shm.h>

/*
* 第一个参数为 key 值,一般由 ftok() 函数产生
* 第二个参数为欲创建的共享内存段大小(单位为字节)
* 第三个参数用来标识共享内存段的创建标识
*/

int shmget(key_t key, size_t size, int shmflg);

2.共享内存控制

#include <sys/ipc.h> #include <sys/shm.h>

/*
* 第一个参数为要操作的共享内存标识符
* 第二个参数为要执行的操作
* 第三个参数为 shmid_ds 结构的临时共享内存变量信息
*/

int shmctl(int shmid, int cmd, struct shmid_ds *buf);

3.映射共享内存对象

系统调用 shmat() 函数实现将一个共享内存段映射到调用进程的数据段中,并返回内存空间首地址,其函数声明如下:

#include <sys/types.h>

#include <sys/shm.h>

/*
* 第一个参数为要操作的共享内存标识符
* 第二个参数用来指定共享内存的映射地址,非0则为此参数,为0的话由系统分配
* 第三个参数用来指定共享内存段的访问权限和映射条件
*/

void *shmat(int shmid, const void *shmaddr, int shmflg);

4.分离共享内存对象

在使用完毕共享内存空间后,需要使用 shmdt() 函数调用将其与当前进程分离。函数声明如下:

#include <sys/types.h>

#include <sys/shm.h>

/*
* 参数为分配的共享内存首地址
*/

int shmdt(const void *shmaddr);

共享内存在父子进程间遵循的约定

1.使用 fork() 函数创建一个子进程后,该进程继承父亲进程挂载的共享内存。

2.如果调用 exec() 执行一个新的程序,则所有挂载的共享内存将被自动卸载。

3.如果在某个进程中调用了 exit() 函数,所有挂载的共享内存将与当前进程脱离关系。

程序实例

申请一段共享内存,父进程在首地址处存入一整数,子进程读出。

#include

#include <sys/ipc.h>

#include <sys/shm.h>

#include <sys/types.h>

#include

#include

#define SHM_SIZE 1024

int main()

{

int shm_id, pid;

int *ptr = NULL;

/* 申请共享内存 */

shm_id = shmget((key_t)1004, SHM_SIZE, IPC_CREAT | 0600);

/* 映射共享内存到进程地址空间 */

ptr = (int*)shmat(shm_id, 0, 0);

printf("Attach addr is %p \n", ptr);

*ptr = 1004;

printf("The Value of Parent is : %d \n", *ptr);

if((pid=fork()) == -1){

perror("fork Err");

exit(0);

}

else if(!pid){printf("The Value of Child is : %d \n", *ptr);exit(0);}else{sleep(1);

/* 解除映射 */

shmdt(ptr);

/* 删除共享内存 */

shmctl(shm_id, IPC_RMID, 0);}return 0;}

输出结果:

架构师进阶:Linux进程间如何共享内存?相关推荐

  1. linux进程间通讯-共享内存

    文章目录 共享内存概述 共享内存的特点 共享内存操作 在ubuntu 12.04中共享内存限制值如下 获得一个共享存储标识符 创建共享内存 共享内存映射(attach) 解除共享内存映射(detach ...

  2. WIN32 进程间通讯-共享内存

    一.引言     在Windows程序中,各个进程之间常常需要交换数据,进行数据通讯.WIN32 API提供了许多函数使我们能够方便高效的进行进程间的通讯,通过这些函数我们可以控制不同进程间的数据交换 ...

  3. linux 进程原理内存,linux进程通信之共享内存原理(基于linux 1.2.13)

    1 有一个全局的结构体数据,每次需要一块共享的内存时(shmget),从里面取一个结构体,记录相关的信息. struct shmid_ds { // 权限相关 struct ipc_perm shm_ ...

  4. 深刻理解 Linux 进程间七大通信(IPC)

    前言 网络编程是 Linux C/C++的面试重点,今天我就来聊一聊进程间通信的问题,文章末尾列出了参考资料,希望帮助到大家. 篇幅有点长,希望大家耐心阅读. Linux 下的进程通信手段基本上是从 ...

  5. linux进程间通信之Posix共享内存用法详解及代码举例

    Posix共享内存有两种非亲缘进程间的共享内存方法: 1).  使用内存映射文件,由open函数打开,再由mmap函数把返回的文件描述符映射到当前进程空间中的一个文件. 2). 使用共享内存区对象,由 ...

  6. Linux云计算架构师进阶班-Docker-K8s-Devops-Openstack

    Linux云计算架构师进阶班-Docker-K8s-Devops-Openstack 下载链接: https://pan.baidu.com/s/1l6Xp7_2UsMYfoEKnJAvjUw 提取码 ...

  7. linux共享内存示例,linux 进程间共享内存示例

    写入端: #include #include #include #include #include using namespace std; struct MappingDataType { int ...

  8. Linux 进程间通讯(IPC)方式 ------- 共享内存

    Linux 进程间通讯(IPC)方式有以下几种: 1->管道(pipe)和有名管道(fifo). 2->消息队列 3->共享内存 4->信号量 5->信号(signal) ...

  9. linux进程间的通信(C): 共享内存

    一.共享内存介绍 共享内存是三个IPC(Inter-Process Communication)机制中的一个. 它允许两个不相关的进程访问同一个逻辑内存. 共享内存是在两个正在进行的进程之间传递数据的 ...

  10. 云架构师进阶攻略(1)

    此文已由作者刘超授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 一.架构的三个维度和六个层面 1.1.三大架构 在互联网时代,要做好一个合格的云架构师,需要熟悉三大架构. 第 ...

最新文章

  1. 图卷积和消息传递理论的可视化详解
  2. (转)iPhone wifi使用socket连接Internet
  3. ubuntu安装mysql 密码忘了怎么办_Ubuntu安装mysql14.14,查看默认密码,重置密码
  4. 2020-11-28 Latex相关小工具
  5. GoldenGate系统三:trouble shooting and log
  6. C# 3.0新特性初步研究 Part5:匿名类型
  7. 使用Mono将C#编译运行至WebAssembly平台
  8. leetcode232. 用栈实现队列
  9. [蓝桥杯]字符串对比-模拟
  10. linux平台下通过mcr方式从c++程序中调用matlab函数
  11. C函数的实现(strcpy,atoi,atof,itoa,reverse)
  12. 小天才被限定使用时长的应用_家庭腕上社交新场景,OPPO Watch、小天才开启暖心联动...
  13. 加密芯片——RSA算法特点与应用注意事项
  14. 我眼中的ASP.NET Core之微服务 (二)
  15. win10系统更新服务器出错怎么办,win10系统正式版自动更新出错的解决方法
  16. 共识算法-PoW(工作量证明)算法
  17. config配置解析
  18. Unity 多端游戏画面同步
  19. GoogleHacking
  20. Hadoop的两个核心组成

热门文章

  1. c++反汇编与逆向分析 小结
  2. 大连市2011年初中毕业升学考试试测(一)数 学
  3. ON1 Resize 2022 for Mac(图片大小修改工具)
  4. Mac如何制作分屏视频
  5. KeyShot实例教程教你怎么模拟水面效果
  6. Thinkphp在Nginx服务器下部署的问题--宝塔面板篇
  7. kmp 学习【字符串-kmp学习】
  8. micro-mvc与主流mvc整合说明
  9. UCC国际洗衣:风雨26年,铸就干洗行业实力品牌
  10. 《从零开始学Swift》学习笔记(Day 13)——数据类型之整型和浮点型