内核共享内存


shmget

头文件 函数

#include <sys/ipc.h>
#include <sys/shm.h>// 得到一个共享内存标识符或创建一个共享内存对象并返回共享内存标识符
int shmget(key_t key, size_t size, int shmflg)
// 成功:返回共享内存的标识符; 出错:-1,错误原因存于error中
key 会建立新共享内存对象
size 大于0的整数:新建的共享内存大小,以字节为单位
size = 0 只获取共享内存时指定为0
shmflg 共享内存标识符
shmflg = IPC_CREAT 如果内核中不存在键值与key相等的共享内存,则新建一个共享内存;如果存在这样的共享内存,返回此共享内存的标识符
shmflg = IPC_CREAT | IPC_EXCL 如果内核中不存在键值 与key相等的共享内存,则新建一个共享内存;如果存在这样的共享内存则报错
shmflg = 0 取共享内存标识符,若不存在则函数会报错

shmat

#include <sys/types.h>
#include <sys/shm.h>// 连接共享内存标识符为shmid的共享内存,连接成功后把共享内存区对象映射到调用进程的地址空间,随后可像本地空间一样访问
void *shmat(int shmid, const void *shmaddr, int shmflg)
// 成功:附加好的共享内存地址;出错:-1,错误原因存于error中
shmid 共享内存标识符
shmaddr 指定共享内存出现在进程内存地址的什么位置,直接指定为NULL让内核自己决定一个合适的地址位置
shmflg SHM_RDONLY:为只读模式,0 为读写模式

shmdt

#include <sys/types.h>
#include <sys/shm.h>// 连接的共享内存
int shmdt(const void *shmaddr)
// 成功:0; 出错:-1,错误原因存于error中
shmaddr 连接的共享内存的起始地址

shmctl

#include <sys/types.h>
#include <sys/shm.h>// 完成对共享内存的控制
int shmctl(int shmid, int cmd, struct shmid_ds *buf)
// 成功:0; 出错:-1,错误原因存于error中
shmid 共享内存标识符
cmd =IPC_STAT 得到共享内存的状态,把共享内存的shmid_ds结构复制到buf中
cmd = IPC_SET 改变共享内存的状态,把buf所指的shmid_ds结构中的uid、gid、mode复制到共享内存的shmid_ds结构内
cmd = IPC_RMID 删除这片共享内存
buf 共享内存管理结构体。具体说明参见共享内存内核结构定义部分

一个通信例子

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/shm.h>
#include <sys/types.h>
#include <string.h>#define addr 0x8888int get_id(int num)
{int id;if (num > 0){// 第一次申请了64哥字节的空间id = shmget(addr, 64, IPC_CREAT | IPC_EXCL | 0664);// 把共享内存区映射到进程的地址空间char *s = (char *)shmat(id, NULL, 0);s = NULL;// 链接共享单元shmdt(s);}else// 共享单元已经创建的时侯, 进行连接就行, 不用创建了id = shmget(addr, 0, 0);return id;
}int main(int argc, char *argv[])
{// argv[1] > 0 第一次, 建立共享空间, 并连接// argv[0] = 0 直接进行连接int id = get_id(atoi(argv[1]));char *s = (char *)shmat(id, 0, 0);char buf[1024];if (argv[2][0] == 'w'){int i;read(1, buf, sizeof(buf));i = 0;while (buf[i] != '\0')s[i] = buf[i++];s[i] = '\0';}else if (argv[2][0] == 'r')write(0, s, strlen(s));else if (argv[2][0] == 'd')shmctl(id, IPC_RMID, 0);exit(EXIT_SUCCESS);
}

运行截图


记住, 最后一定要用 否则创建的共享区会一直在关机前都会存在, 不会释放通过 . ipcs查看共享空间块

./aout 0 d

共享内存 shmget函数相关推荐

  1. Linux进程间通信源码剖析,共享内存(shmget函数详解)

    转至:http://blog.csdn.net/lanmanck/article/details/6092995 shmget int shmget(key_t key, size_t size, i ...

  2. 共享内存(shmget函数详解)

    shmget int shmget(key_t  key, size_t  size, int  flag); key: 标识符的规则 size:共享存储段的字节数 flag:读写的权限 返回值:成功 ...

  3. 共享内存 shmget函数

    创建共享内存 int shmget( key_t key, size_t size, int flag ); //such as:key_t key = ftok(".",1);s ...

  4. 共享内存---shmget shmat shmdt

    From: http://fengxue103.blog.hexun.com/32303320_d.html 要使用共享内存,应该有如下步骤: 1.开辟一块共享内存 shmget() 2.允许本进程使 ...

  5. c语言中shmget相关函数,unix中共享内存(shmget的实现,非mmap)

    共享内存是系统出于多个进程之间通讯的考虑,而预留的的一块内存区.在/proc/sys/kernel/目录下,记录着共享内存的一些限制,如一 个共享内存区的最大字节数shmmax,系统范围内最大共享内存 ...

  6. 共享内存 - shmget填坑记

    shmget设置的size值,不能大于最大值SHMMAX和小于最小值SHMMIN 且若是key值对应的段已经存在,那么后来使用shmget的size值要小于等于原来的值函 而后询问了一下那位程序猿,他 ...

  7. 共享内存shmget的郁闷

    今天上午试验共享内存 shmget,但是总是不能成功申请到内存. 一开始还以为是第一个参数key有问题,调试了半天,发现key是正确的,没有报错,也可以根据不同路径变化. key_t ftok(con ...

  8. 共享内存(shmget,shmat,shmdt,shmctl)

    共享内存shmgetshmatshmdtshmctl shmget int shmget(key_t key, size_t size, int flag); key: 标识符的规则 size:共享存 ...

  9. linux 共享内存 shmget

    专栏内容:linux下并发编程 个人主页:我的主页 座右铭:天行健,君子以自强不息:地势坤,君子以厚德载物. 目录 前言 概述 原理机制 系统命令 接口说明 代码演示 结尾 前言 本专栏主要分享lin ...

最新文章

  1. C++ mutable
  2. SegICP:一种集成深度语义分割和位姿估计的框架(附代码)
  3. SAP PP ECR的Profile规定了用它可以修改哪些数据对象
  4. java的守护线程与非守护线程
  5. (数据库系统概论|王珊)第十一章并发控制-第五、六、七节:并发调度的可串行性、两段锁协议和封锁的粒度
  6. 谈谈阿里所谓的——要性
  7. 4010-基于邻接矩阵的边的删除(C++,附思路)
  8. spring整合atomikos实现分布式事务的方法示例_分布式事务一:基于数据库原生分布式事务方案实现...
  9. UI素材实用模板|2.5D等距风格插画专辑
  10. pcs7 simatic batch v9.0_西门子V90 伺服STO安全功能注意事项
  11. Linux中grep命令使用方法
  12. windows桌面动态主题_如何在Windows 10上安装桌面主题
  13. 最新版万能编辑器Visual Studio Code安装使用教程
  14. eleme接口测试01(C#)
  15. 【有趣的历史】为什么超链接是蓝色的?
  16. SPLAYER中文字幕乱码
  17. 追光而遇,沐光而行:相约未来GIS实验室
  18. linux进入黑洞路由,BGP路由黑洞解决办法介绍
  19. 微软C#中的CHART图表控件
  20. 怎么做护士长岗位竞聘演讲PPT课件?

热门文章

  1. 中国大学mooc上的python-Python程序设计及应用(上)
  2. (javaweb-09) Filter
  3. 建仓类型与对应建仓价MT4
  4. 苹果8plus什么用计算机,iphone8plus怎么把手机投屏到电脑显示器
  5. 【常用电子元件】光敏二极管的简介与应用(实例:STM32监测光强)
  6. ubuntu | 命令行中输出文件夹下的文件+输出某个后缀的文件+文件名作为参数运行py脚本
  7. 乔布斯的创新之道:想象力是第一生产力
  8. python自定义事件event的含义_事件Event详解
  9. 谈谈IBM布局的Bluemix和SoftLayer生态体系
  10. 心理学与计算机交叉学,认知心理学其与邻近学科交叉产物