Linux共享内存及共享内存API
共享内存区是最快的IPC(进程间通信)形式。
用共享内存从服务器拷贝文件数据到客户端:
共享内存基本API:
#include<sys/ipc.h>
#include<sys/shm.h>
1. int shmget(key_t key,size_t size,int shmflg);
功能:用来创建共享内存
//若共享内存存在 则使用 fopen()
//若共享内存 不存在 则报错 -1
//若共享内存存在 则使用 fopen()
//若共享内存 不存在 则创建
//若共享内存存在 则报错
//若共享内存 不存在 则创建
//作用 IPC_EXCL判断存在不存在的标志 避免已经存在的文件 被覆盖
2. void *shmat(int shmid, const void *shmaddr, int shmflg);0xaa11
功能:将共享内存段连接到进程地址空间
shmaddr:指定连接的地址,因为内存地址是段页式管理,所以有可能传入的地址并不就是那一页的开头位置,所以传入一个地址,传出的仍然是一个地址,传出的是具体开始存储的地址。所以我们通常传入NULL,让编译器直接分配个合适的位置给我们。
shmflg:它的两个取值可能是SHM_RND和SHM_RDONLY.
例: void *p = shmat(shmid, NULL, 0);
返回值:成功返回一个指针,指向共享内存第一个节,失败返回-1;
3, int shmdt(const void *shmaddr);
功能:将共享内存段与当前进程脱离,但并不等于删除共享内存段
4, int shmctl(int shmid,int cmd,struct shmid_ds *buf);
功能:用于控制共享内存
cmd:将要采取的动作
1,IPC_STAT 把shmid_ds结构中的数据设置为共享内存的当前关联值
2,IPC_SET 在进程有足够权限的前提下,把共享内存的当前关联值设置为shmid_ds数据结构中给出的值
3,IPC_RMID 删除共享内存段
buf: 指向一个保存着共享内存的模式状态和访问权限的数据结构
例: shmctl(shmid, IPC_RMID, NULL);
//删除共享内存
若想要把旧的共享内存里面的内容保存下来,则传入一个地址,用来完成保存的功能
为什么链接共享内存时要设计shmid,创建时要传入key:
共享内存私有:
Linux共享内存及共享内存API相关推荐
- Linux进程间通信六 Posix 共享内存简介与示例
1. 共享内存简介 共享内存主要用于不同进程之间相互通信,因为操作的是同一块地址,不需要内核和用户层之间数据拷贝,属于最快的进程间通信方式,不过,为了防止读写冲突,一般需要额外的同步手段.之前介绍了S ...
- linux c之使用共享内存实现进程间通信
这篇博客有别人的也有自己改的,作为读书笔记,勿喷. 1.共享内存的介绍 共享内存就是允许两个不相关的进程访问同一个逻辑内存.共享内存是在两个正在运行的进程之间共享和传递数据的一种非常有效的方式.不同进 ...
- Linux基础入门--进程间通信--共享内存
Linux基础入门--进程间通信--共享内存 1.共享内存IPC原理 2.共享内存管理 1.共享内存IPC原理 共享内存进程间通信机制主要用于实现进程间大量的数据传输,共享内存是在内存单独开辟的一段内 ...
- Linux 18 IPC之共享内存shm
一.原理 共享内存是三个IPC(Inter-Process Communication)机制中的一个. 它允许两个不相关的进程访问同一个逻辑内存. 共享内存是在两个正在进行的进程之间传递数据的一种非常 ...
- linux进程间通讯-共享内存
文章目录 共享内存概述 共享内存的特点 共享内存操作 在ubuntu 12.04中共享内存限制值如下 获得一个共享存储标识符 创建共享内存 共享内存映射(attach) 解除共享内存映射(detach ...
- Linux c 基于内存的进程通信—共享内存、共享队列(消息队列)
基于内存的进程通信: 1. 内核共享内存 编程模型: 1.1.创建共享内存,得到一个ID shmget 1.2.把ID影射成虚拟地址(挂载) shmat 1.3.使用虚拟地址访问 ...
- linux进程实现进程通信内存共享,Linux进程间通信 -3内存共享
内存共享允许两个或多个不相关的进程,访问同一个逻辑内存,共享内存的具体实现,由不同进程之间共享的内存安排为同一物理内存. 过个进程就像通过malloc获取的内存一样去使用,但是需要额外的小消息来同队内 ...
- system v和posix的共享内存对比 共享内存位置
参考 http://www.startos.com/linux/tips/2011012822078.html 1)Linux和所有的UNIX操作系统都允许通过共享内存在应用程序之间共享存储空间. 2 ...
- c++ fork 进程时 共享内存_linux共享内存mmap
Linux进程间通信-共享内存mmap 采用共享内存通信的一个显而易见的好处是效率高,因为进程可以直接读写内存,而不需要任何数据的拷贝.对于像管道和消息队列等通信方式,则需要在内核和用户空间进行四次的 ...
- 好理解的Java内存虚假共享(False Sharing)性能损耗以及解决方案
虚假共享(False Sharing)也有人翻译为伪共享 参考 https://en.wikipedia.org/wiki/False_sharing 在计算机科学中,虚假共享是一种性能降低的使用模式 ...
最新文章
- 冒泡排序,斐波拉契迭代、生成器
- mathematica 可编辑pdf_Mathematica学习笔记[1]
- 【网络通信与信息安全】之深入分析Token、session和cookie的使用场景和区别
- 上传问题分析1--文件保存位置
- 源码分析Android Handler是如何实现线程间通信的
- java 线程参数 用final,JAVA 关于final修饰变量参数
- stm32固件库文件
- 基于matlab的声音个数识别
- 多类别车辆跟踪-模型训练、评估、预测、优化到部署的全流程方案_副本
- 工作中如何进行接口测试
- 计算机无法计算,计算机无法计算到的F1最后一步
- [2011JMAA]Remarks on the regularity criteria for generalized MHD equations
- 2012年中国各省市区GDP排行榜 附各主要城市GDP排行榜
- buck电路 dac stm32_嵌入式设计-基于STM32F334的BUCK同步降压数字电源设计-电路城论坛 - 电子工程师学习交流园地...
- elevation格式_Google Elevation的工作方式以及如何创建简单的C#应用​​程序?
- C++基础---空类型
- 北京科技大学 Dog类定义和测试
- [BZOJ]4180: 字符串计数 SAM+矩阵乘法+二分
- 纯C实现员工工资管理系统
- C语言输出格式控制符大全