一、shm 和 mmap 的区别

(1)mmap 是在磁盘上建立一个文件,每个进程地址空间中开辟出一块空间进行映射。shm 每个进程最终会映射到同一块物理内存。shm 保存在物理内存,这样读写的速度最快,也意味着存储量不是特别大(因为物理内存依赖硬件,相对于磁盘也肯定不大)。
(2)mmap 有一个好处是当机器重启,因为 mmap 把文件保存在磁盘上,这个文件还保存了操作系统同。
步的映像,所以 mmap 不会丢失,但是 shm 就会丢失数据
(3)操作 shm 的进程退出后,共享内存还是存在的,需要人为手动释放(或者关机,系统自动回收)。

二、shm 的操作函数

头文件 :

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

1、创建或打开一个共享内存(申请一块物理内存)

(1)函数原型:

int shmget(key_t key, size_t size, int shmflg);//key 除了自己指定外,也可以通过 ftok() 获得

(2)参数:
key:非 0 的十六进制整形 ,可以理解为:共享内存的名字(唯一的)。进程间通信依靠 key 来定位共享内存的位置
size:申请内存的大小,与 mmap 相同,内核会在你申请的大小基础上,调整为 4K 的整数倍。
shmflg:设置共享内存的操作权限。
(3)其中创建共享内存方法为:IPC_CREAT | IPC_EXCL | 0666
打开已创建的共享内存:可直接填 0 表示
IPC_CREAT :创建一块共享内存
IPC_EXCL : 如果通过 IPC_CREAT 创建共享内存,但该共享内存已存在,报错。
八进制数 : 所有者、同组、其他人的权限。

2、将申请的共享内存和当前进程关联在一起

(1)函数原型:

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

(2)参数:
shmid:shmget() 的返回值。
shmaddr:进程中地址空间中的某个地址,用于和共享内存首地址相连,我们不知道,传 NULL,由内核去帮我们指定,通过返回值获得。
shmflg:该进程对共享内存的操作权限。
返回值:
成功 :操作共享内存的首地址。
失败 :(void*) -1

3、 当共享内存使用结束后,当前进程与共享内存断开关联

(1)函数原型:

int shmdt(const void *shmaddr); // dshm detach // 注意:仅仅是断开关联,内存并没有被回收销毁

(2)参数: shmat() 的返回值
(3)返回值:
成功 : 0
失败 :-1

4、 设置销毁共享内存(这个函数中有一个最常用的功能,销毁共享内存)

(1)函数原型:

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

(2)参数:
shmid :shget() 的返回值。
cmd :设置的动作,销毁,填 IPC_RMID。
buf :共享内存状态的结构体,销毁,填 NULL。
(3)返回值:
成功 : 0
失败 : -1

Linux学习之系统编程篇:shm 共享内存及其操作函数相关推荐

  1. Linux学习之系统编程篇:单个线程的退出函数

    能否用 exit 来退出某个线程,exit 是用来退出进程的,因为父子线程共享同一地址空间,如果在某线程中使用,会使 所有线程全退出,因此需要使用别的函数 :pthread_exit (注意:子线程使 ...

  2. Linux学习之系统编程篇:mmap 内存映射区

    (1)作用:将磁盘文件的数据映射内存,用户通过修改内存就能修改磁盘文件. (2)函数原型: void *mmap(void *addr, size_t length, int prot, int fl ...

  3. Linux学习之系统编程篇:利用 shm 进行进程间通信

    一.写进程 shm_w.c #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include ...

  4. Linux学习之系统编程篇:条件变量(pthread_cond_init / wait / signal / broadcast / destroy)

    一.条件变量的认识 (1)条件变量的引出: 各个线程访问共享资源,比如说共享资源是一个空资源,那么,各线程的访问其实都是无效访问,因此需要一个机制,首先阻塞线程,以免其错误访问,待条件满足时(比如 共 ...

  5. Linux学习之系统编程篇:读写锁(pthread_ rwlock _init / rdlock / wrlock / unlock / destroy)

    一.读写锁的认识 (1)读写锁是1把锁. (2)读写锁的类型: pthread_rwlock_t lock 又分"读锁"(不让读内存)和"写锁"(不让写内存) ...

  6. Linux学习之系统编程篇:练习验证线程共享全局变量

    #include <pthread.h> #include <stdio.h> #include <unistd.h> int var = 1001; void * ...

  7. Linux学习之系统编程篇:ps 和 kill 命令以及父子进程间数据共享模式

    一.ps 和 kill 命令 1.ps 命令 常用方式: ps aux :查看正在运行进程信息(主要查 pid). ps ajx :更加详细(PID. PPID:父进程 id. PGID:进程组 id ...

  8. Linux学习之系统编程篇:对线程的基本认识

    (1)fork()后创建的子进程是父进程的拷贝,那么pthread_create,创建线程,创建的线程跟原进程有什么关系呢? fork 会通过拷贝产生新的虚拟地址空间(PCB 会变化),而 pthre ...

  9. Linux学习之系统编程篇:IPC 和管道的基本概念及管道的创建

    一.IPC 概念 IPC: 进程间通信. 进程间通信的常见的 4 中方式: (1)管道 pipe fifo :最简单(但只能在有血缘关系下进行). (2)信号 signal : 属于系统的,所以系统开 ...

最新文章

  1. 【SPOJ 694】Distinct Substrings (更直接的求法)
  2. linux下rip服务启动失败,RIP协议_linux系统管理与服务的技术博客_51CTO博客
  3. SQL 查找是否存在,别再 count 了,很耗费时间的!
  4. 用户生命周期常用指标_生命周期管理工具如何使用指标
  5. DSP5509项目之用FFT识别钢琴音调(5)之开始傅里叶变换
  6. 11-7 无底洞问题
  7. Linux集群:LVS搭建负载均衡集群(二)
  8. rcmd–App Switcher for Mac快速切换应用程序
  9. latex 行内公式
  10. python代码价格_在Python中如何用代码求出超过某价格的且受欢迎程度top5的菜品名?...
  11. Win10系统如何在Word中添加新字体
  12. python矩阵连乘_第3章 动态规划——矩阵连乘最优计算方式查找
  13. win easypanel安装php,windows下kangle虚拟主机-kangleeasypanel安装图文教程以及心得
  14. php私有云盘,教你搭建个人/企业私有云盘-kodexplorer
  15. iOS开发- 实现类似于陌陌点点和探探首页切换效果类似
  16. stm32 app 连上阿里云
  17. 你公司哪个部门是“老大”?
  18. 中国移动飞信免费发短信API接口(第三方)
  19. MySQL数据库多表查询,子查询
  20. 【第十六篇】商城系统-认证系统构建

热门文章

  1. 前端生成Excel 表格
  2. AIS 2022 | ACL-IJCAI-SIGIR顶级会议论文预讲会,现开启论文征集
  3. TensorFlow 2.0不好用?会了是“真香”!
  4. 基于深度迁移学习进行时间序列分类
  5. 河北计算机一级考试题库操作题,年河北计算机一级操作题题库及答案.doc
  6. java数据传递给安卓_Android数据传递的五种方法汇总
  7. java linkedlist源码_Java集合之LinkedList源码分析
  8. 教你一招如何使用几行代码实现zookeeper作为springcloud的服务注册中心
  9. 管理员访客身份登录用户账户,java web/springboot/mybatis实现只能看用户信息但不允许修改
  10. java获取随机正整数