• 进程通信之共享内存


    共享内存的原理

    在这里插入图片描述

    共享内存是进程通信的一种方式
    共享内存的原理可以这么理解
    操作系统申请了一块内存空间,并且映射在需要通信的各进程的共享区(堆栈之间),然后操作系统将映射的虚拟地址返回给用户(进程)。

    使用共享内存通信的进程或许有很多,每个共享内存都通过特定的数据结构描述起来,这个数据结构包括共享内存的唯一标识key、共享内存的大小size、使用该共享内存的进程数attch等等。

    共享内存是最快的IPC形式。内存映射到共享它的进程的地址空间后,这些进程不再通过执行进入内核的系统调用来进行数据传递。

    相关指令

    在这里插入图片描述

    使用共享内存函数通信

    1. ftok函数
    在这里插入图片描述
    一般情况下,两个参数都可以任意填写,函数的作用是返回一个唯一的key值供其他地方使用。

    2. shmget函数:

    功能:用来创建共享内存

    原型:

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

    参数:

    key:用户层生成的区分各个共享内存的标识
    size:共享内存大小
    shmflg:第三个参数可以填写如下

    IPC_CREAT:
    如果内核中不存在键值与key相等的共享内存,则新建一个共享内存;如果存在这样的共享内存,返回此共享内存的标识符

    IPC_CREAT|IPC_EXCL:
    如果内核中不存在键值 与key相等的共享内存,则新建一个共享内存;如果存在这样的共享内存则报错

    0:
    返回共享内存的标识符

    返回值:
    成功返回一个非负整数,即该共享内存段的标识码;失败返回-1

    注意这里返回的标识符不是key,而是shmid,两者都标识这块共享内存,但是创建共享内存之后,我们使用shmid来操作

    3.shmat函数

    功能:将共享内存段连接到进程地址空间
    原型

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

    参数
    shmid: 共享内存标识
    shmaddr:一般传NULL即可
    shmflg:一般传0即可

    返回值:成功返回一个指针,指向共享内存起始地址,失败返回-1

    4.shmdt函数

    功能:将共享内存段与当前进程脱离

    原型

     int shmdt(const void *shmaddr);
    
    • 1

    参数

    shmaddr: 由shmat所返回的指针
    返回值:成功返回0;失败返回-1

    注意:将共享内存段与当前进程脱离不等于删除共享内存段

    5.shmctl函数

    功能:用于控制共享内存

    原型:

    int shmctl(int shmid, int cmd, struct shmid_ds *buf)
    
    • 1

    返回值:成功返回0;失败返回-1

    可用来删除共享内存,因为共享内存不是随着进程结束就自动释放,需要我们删除,使用此函数删除时,第二个参数传为IPC_RMID,第三个参数传为NULL即可。

    也可以使用指令来删除

    ipcs -m shmid

  • 相关阅读:
    C++前缀和算法的应用:装包裹的最小浪费空间 原理源码测试用例
    Acwing 3208. Z字形扫描 偏移量+扩展图
    LeetCode刷题系列 -- 39. 组合总和
    关于印发《深圳市福田区支持战略性新兴产业和未来产业集群发展若干措施》的通知
    WinForm RichTextBox 加载大量文本卡死和UTF-8乱码问题
    蓝牙mesh基础(基本术语)
    陶氏公司将出席2023第二届中国汽车碳中和峰会
    commons-io版本变动在windows环境下引发的NTFS ADS separator问题
    SpringBoot整合MyBatis从零开始
    Cannot activate rust-analyzer: bootstrap error
  • 原文地址:https://blog.csdn.net/sqjddb/article/details/124894122