Linux system v 共享内存
system v 共享内存
#include <sys/types.h>
#include <sys/shm.h>
int shmget(key_t key, size_t size, int shmflg);
建立:进程与共享内存的关联关系
key_t key:16进制的非0数字。
一般有两种方式设置它。
第一种:调用fotk函数
第二种:直接使用IPC_PRIVATE
注意:如果两次调用ftok函数时,参数都一样,那么得到的key_t key是一样的,所以shmget函数的返回值也是一样的,也就是说可以访问同一个共享内存。如果使用IPC_PRIVATE,那么shmget函数的返回值每次都不一样。
size:共享内存的大小
shmflg:
- IPC_CREAT
- IPC_EXCL
- 用户,组用户,其他用户对这片内存的权限,有9个bit来表示,比如664
返回值:成功返回这片共享内存的标识号;失败返回-1,errno被设置。
#include <sys/types.h>
#include <sys/shm.h>
void *shmat(int shmid, const void *shmaddr, int shmflg);
- shmid:由shmget函数创建的,也就是shmget函数的返回值
- shmaddr:
- NULL:让内核去申请内存空间
- 非NULL:自己用malloc开辟一个空间,让共享内存shmid和这个地址关联上。但是如果不是4K的整数倍,内核会向上或者向下调整。
- shmflg:
- SHM_RND:读写
- SHM_RDONLY:只读
- 返回值:
- 成功:返回内存地址
- 失败:返回(void *) -1
#include <sys/types.h>
#include <sys/shm.h>
int shmdt(const void *shmaddr);
取消进程与共享内存的关联关系
- shmaddr:shmat的返回值
- 返回值:成功0;失败-1,并设置errno。
#include <sys/types.h>
#include <sys/shm.h>
int shmctl(int shmid, int cmd, struct shmid_ds *buf);
对共享内存操作,更具cmd的不同,对共享内存进行不同的操作。
- shmid:由shmget函数创建的,也就是shmget函数的返回值
- cmd:
- IPC_STAT:得到共享内存的状态
- IPC_RMID:标记删除共享内存(当共享内存的引用计数变为0时,删除)
- IPC_SET:设置共享内存的属性(修改权限,修改shmid等)
- 等等
- buf:shmid_ds结构体
- 返回值:当cmd是IPC_RMID时:成功0;失败-1,并设置errno
用命令【ipcs】可以查看共享内存的状态
------ Shared Memory Segments --------
key shmid owner perms bytes nattch status
0x00007fff 65536 ys 664 256 0
0x00007ffe 98305 ys 664 256 0
0x0000555e 131074 ys 664 256 0
0x00000011 229379 ys 664 256 3
- key:函数shmget指定的第一个参数
- shmid:函数shmget的返回值
- owner:属于哪个用户创建的
- perms:这个共享内存的访问权限
- bytes:大小
- nattch:使用这个共享内存的进程的数量
- status:共享内存的状态
c/c++ 学习互助QQ群:877684253

本人微信:xiaoshitou5854
Linux system v 共享内存的更多相关文章
- Linux进程通信之System V共享内存
前面已经介绍过了POSIX共享内存区,System V共享内存区在概念上类似POSIX共享内存区,POSIX共享内存区的使用是调用shm_open创建共享内存区后调用mmap进行内存区的映射,而Sys ...
- Linux IPC实践(9) --System V共享内存
共享内存API #include <sys/ipc.h> #include <sys/shm.h> int shmget(key_t key, size_t size, int ...
- 阐述linux IPC(五岁以下儿童):system V共享内存
[版权声明:尊重原创.转载请保留源:blog.csdn.net/shallnet 要么 .../gentleliu,文章学习交流,不用于商业用途] system V共享内存和posix ...
- linux网络编程之system v共享内存
接着上次的共享内存继续学习,这次主要是学习system v共享内存的使用,下面继续: 跟消息队列一样,共享内存也是有自己的数据结构的,system v共享内存也是随内核持续的,也就是说当最后一个访问内 ...
- System V 共享内存区
1.概述 系统调用mmap通过映射一个普通文件实现共享内存.System V 则是通过映射特殊文件系统shm中的文件实现进程间的共享内存通信.也就是说,每个共享内存区域对应特殊文件系统shm中的一个文 ...
- System V共享内存介绍
(一)简单概念 共享内存作为一种进程间通信的方式,其相较于其他进程间通信方式而言最大的优点就是数据传输速率快.其内部实现的方式采用了Linux进程地址空间中的mmap文件映射区,将文件内容直接映射到各 ...
- UNIX环境高级编程——System V 共享内存区
共享内存区域是被多个进程共享的一部分物理内存.如果多个进程都把该内存区域映射到自己的虚拟地址空间,则这些进程就都可以直接访问该共享内存区域,从而可以通过该区域进行通信.共享内存是进程间共享数据的一种最 ...
- php进程(线程)通信基础--System V共享内存
PHP默认情况没有开启功能,要支持该功能在编译PHP的时候要加入下面几个选项 System V消息,--enable-sysvmsg System V信号量支持,--enable-sysvsem ...
- 共享内存之——system V共享内存
System V 的IPC对象有共享内存.消息队列.信号灯(量). 注意:在IPC的通信模式下,不管是共享内存.消息队列还是信号灯,每个IPC的对象都有唯一的名字,称为"键(key)&quo ...
随机推荐
- [转]Introduction - Run Excel Macro using VBScript
本文转自:https://wellsr.com/vba/2015/excel/run-macro-without-opening-excel-using-vbscript/ Have you ever ...
- Java-环境搭建(Mac版)
对于开发人员来说,电脑的性能很重要,所以换了Mac后需要重新配置开发环境,网上对Windows系统的Java环境配置有很多,所以,这里就不多介绍.现在记录一下在Mac电脑上的Java环境配置. 众所周 ...
- Octave中的矩阵操作
>> a=[1 2;3 4;5 6];>> b=ones(2,3)b = 1 1 1 1 1 1 >> a*b 矩阵的乘法ans = 3 3 3 7 7 7 11 ...
- 小型数据库性能对比(对比了SQLite、FireBird、FastDB、SQLServer2000绿色版、Access、BDB、PostgreSQL)
一.全面对比 SQLite.FireBird.FastDB.SQLServer2000绿色版.Access.BDB.PostgreSQL对比结果如下: 二.国产数据库 三.SQLite 与Postgr ...
- 异常类的构建——顶层父类Exception的实现
异常类构建异常的类型可以是自定义类类型对于类类型异常的匹配依旧是从上到下严格的匹配赋值兼容性原则在异常匹配中依然适用一般而言-匹配子类异常的catch放在上部-匹配父类异常的catch放在下部 现代C ...
- MSYQL主从复制-Gtid方式
目录 1.MYSQL主从复制-Gtid方式 1.环境准备 2.Master配置 3.Slave配置 4.报错&解决 我叫张贺,贪财好色.一名合格的LINUX运维工程师,专注于LINUX的学习和 ...
- 201871010113-刘兴瑞《面向对象程序设计(java)》第十周学习总结
项目 内容 这个作业属于哪个课程 <任课教师博客主页链接> https://www.cnblogs.com/nwnu-daizh/ 这个作业的要求在哪里 <作业链接地址>htt ...
- LeetCode 1244. 力扣排行榜
地址 https://www.acwing.com/solution/LeetCode/content/5765/ 题目描述新一轮的「力扣杯」编程大赛即将启动,为了动态显示参赛者的得分数据,需要设计一 ...
- MVC、MTV、FBV、CBV、母版和继承:
cookie session cookie的定义: 保存在浏览器上的一组组键值对 (请求头) 为什么要有? http协议是无状态,每次的请求之间是相互独立的,没有办法保存状态. Django中操作co ...
- python做中学(三)条件编译的用法
C代码中经常使用条件编译,python中该怎么用呢?Python没有像C或C或Java甚至Java一样编译,python文件被“即时”编译,您可以将其视为类似于Basic或Perl的解释语言 只需使用 ...