【Linux】进程间通信----共享内存
发布日期:2021-05-10 06:33:25 浏览次数:21 分类:精选文章

本文共 1009 字,大约阅读时间需要 3 分钟。

共享内存

1. 共享内存的原理

在物理内存中开辟一段空间,这段空间可以被不同的进程附加到自己的共享区中。附加的进程通过操作共享区来交换数据。每个进程附加到共享内存的方式类似于打开文件,每个进程都有自己的共享内存入口,但实际上共享内存的数据是同一块物理内存。

2. 共享内存的接口

共享内存的主要操作包括创建、删除和附加共享内存。以下是常用函数的说明:

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

    key:共享内存标识符,可任意指定,需确保唯一性。
    size:共享内存的大小。
    shmflg: Hos典型值为IPC_CREAT | IPC_EXCL,用于创建模式,确保共享内存不存在才创建,否则返回错误。
    返回值:共享内存操作句柄。
    书写提示:注意处理未授权访问情况,舍弃不必要的错误提示。

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

    shmid:共享内存操作句柄。
    shmaddr:附加到共享内存的虚拟地址,传递NULL让系统自动分配地址。
    shmflg:访问模式,SHM_RDONLY表示只读,0 表示可读可写。
    返回值:附加成功的共享内存地址。

  • int shmdt(const void *shmaddr)

    消耗共享内存区域,返回空闲状态。需谨慎使用,避免因升级数据结构引发应用逻辑错误。

共享内存的生命周期受操作系统内核管理,默认自比回收,若存储过程未释放,待进程退出或共享内存被删除则内存被回收。

3. 共享内存的标识符与操作句柄的区别

  • 标识符:用于唯一标识共享内存资源,类似于身份证,多个进程可通过标识符识别同一资源。
  • 操作句柄:进程获取的共享内存入口,用于执行具体操作,如附加、读取、写入、删除等。操作句柄能够反映共享内存的最新状态。

4. 删除共享内存

共享内存的释放遵循以下规则:

  • 确保所有附加进程已脱离(可用shmdt查询状态)。
  • 使用shmctlipcrm -m删除共享内存。
    在操作前,建议执行ipcs验证共享内存状态,避开正在被其他进程使用的情况。

5. 共享内存的操作建议

  • 在共享内存初次使用前,建议首先通过shmget检验类型,避免因类型不符导致操作失败。
  • 减少共享内存分块数量,提升性能(尤其在多-zone环境下)。
  • 避免因非必要情况频繁映射或操作共享内存,影响系统负载。
  • 上一篇:【C++】函数模板及类模板详解
    下一篇:【进程】进程间通信----管道

    发表评论

    最新留言

    做的很好,不错不错
    [***.243.131.199]2025年04月17日 15时56分16秒