From: http://fengxue103.blog.hexun.com/32303320_d.html

要使用共享内存,应该有如下步骤:
1.开辟一块共享内存 shmget()
2.允许本进程使用共某块共享内存 shmat()
3.写入/读出
4.禁止本进程使用这块共享内存 shmdt()
5.删除这块共享内存 shmctl()或者命令行下ipcrm

ftok()。它有两个参数,一个是字符串,一个是字符。字符串一般用当前进程的程序名,字符一般用来标记这个标识符所标识的共享内存是这个进程所开辟的第几个共享内存。ftok()会返回一个key_t型的值,也就是计算出来的标识符的值。

shmkey = ftok( "mcut" , 'a' ); // 计算标识符

操作共享内存,我们用到了下面的函数
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>

int shmget( key_t shmkey , int shmsiz , int flag );
void *shmat( int shmid , char *shmaddr , int shmflag );
int shmdt( char *shmaddr );

shmget()是用来开辟/指向一块共享内存的函数。参数定义如下:
key_t shmkey 是这块共享内存的标识符。如果是父子关系的进程间通信的话,这个标识符用IPC_PRIVATE来代替。但是刚才我们的两个进程没有任何关系,所以就用ftok()算出来一个标识符使用了。
int shmsiz 是这块内存的大小.
int flag 是这块内存的模式(mode)以及权限标识。
模式可取如下值: 新建:IPC_CREAT
使用已开辟的内存:IPC_ALLOC
如果标识符以存在,则返回错误值:IPC_EXCL
然后将“模式” 和“权限标识”进行“或”运算,做为第三个参数。
如: IPC_CREAT | IPC_EXCL | 0666
这个函数成功时返回共享内存的ID,失败时返回-1。

// shmid开辟共享内存

shmid = shmget( shmkey , sizeof(in_data) , IPC_CREAT | 0666 ) ;

shmat()是用来允许本进程访问一块共享内存的函数。
int shmid是那块共享内存的ID。
char *shmaddr是共享内存的起始地址
int shmflag是本进程对该内存的操作模式。如果是SHM_RDONLY的话,就是只读模式。其它的是读写模式
成功时,这个函数返回共享内存的起始地址。失败时返回-1。

char *head , *pos ,

head = pos = shmat( shmid , 0 , 0 );

// 允许本进程使用这块共享内存

shmdt()与shmat()相反,是用来禁止本进程访问一块共享内存的函数。
参数char *shmaddr是那块共享内存的起始地址。
成功时返回0。失败时返回-1。

shmdt( head ); // 禁止本进程使用这块内存

此外,还有一个用来控制共享内存的shmctl()函数如下:
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>

int shmctl( int shmid , int cmd , struct shmid_ds *buf );
int shmid是共享内存的ID。
int cmd是控制命令,可取值如下:
IPC_STAT 得到共享内存的状态
IPC_SET 改变共享内存的状态
IPC_RMID 删除共享内存
struct shmid_ds *buf是一个结构体指针。IPC_STAT的时候,取得的状态放在这个结构体中。如果要改变共享内存的状态,用这个结构体指定。
返回值: 成功:0
失败:-1

shmctl(shmid,IPC_RMID,NULL);

刚才我们的mpaste.c程序中还可以加入这样几句。

struct shmid_ds buf;
... ...
shmctl( shmid , IPC_STAT , &buf ); // 取得共享内存的状态
... ...
shmctl( shmid , IPC_RMID , &buf ); // 删除共享内存

注意!!!!!!!!!:在使用共享内存,结束程序退出后。如果你没在程序中用shmctl()删除共享内存的话,一定要在命令行下用ipcrm命令删除这块共享内存。你要是不管的话,它就一直在那儿放着了。
简单解释一下ipcs命令和ipcrm命令。

取得ipc信息:
ipcs [-m|-q|-s]
-m 输出有关共享内存(shared memory)的信息
-q 输出有关信息队列(message queue)的信息
-s 输出有关“遮断器”(semaphore)的信息
%ipcs -m

删除ipc
ipcrm -m|-q|-s shm_id
%ipcrm -m 105

共享内存---shmget shmat shmdt相关推荐

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

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

  2. Linux共享内存二维数组,linux系统编程--shmget shmat shmdt

    要使用共享内存,应该有如下步骤: 1.开辟一块共享内存 shmget() 2.允许本进程使用共某块共享内存 shmat() 3.写入/读出 4.禁止本进程使用这块共享内存 shmdt() 5.删除这块 ...

  3. 共享内存 shmget函数

    内核共享内存 shmget 头文件 函数 #include <sys/ipc.h> #include <sys/shm.h>// 得到一个共享内存标识符或创建一个共享内存对象并 ...

  4. 共享内存shmget传输数据

    共享内存的接口函数以及指令 1.查看系统中的共享存储段 ipcs -m 删除系统中的共享存储段 ipcrm -m [shmid] 3.shmget ( ):创建共享内存 int shmget(key_ ...

  5. 共享内存shmget的郁闷

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

  6. 共享内存 - shmget填坑记

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

  7. shmget物理内存_Linux进程间通信(六):共享内存 shmget()、shmat()、shmdt()、shmctl()...

    下面将讲解进程间通信的另一种方式,使用共享内存. 一.什么是共享内存 顾名思义,共享内存就是允许两个不相关的进程访问同一个逻辑内存.共享内存是在两个正在运行的进程之间共享和传递数据的一种非常有效的方式 ...

  8. Linux 3.进程间通信(shmget shmat shmdt shmctl 共享内存、signal signaction sigqueue 信号、semget semctl semop 信号量)

    Linux 3.进程间通信(IPC) 共享内存 共享内存的接口指令 shmget 创建获取获取共享内存 shmat 映射:连接共享内存到当前进程的地址空间 shmdt 断开与共享内存的连接 shmct ...

  9. linux 共享内存 shmget

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

最新文章

  1. 年仅 16 岁的黑客少年,竟是搅乱 IT 巨头的幕后主使?
  2. python使用Spacy迁移学习库进行句法分析实战
  3. JAVA开发出现的BUG集_Java项目开发中一些BUG的总结
  4. javaweb之Java基础加强
  5. graphpad图片怎么导出矢量图_CorelDRAW导出的图片颜色失真怎么办
  6. url、href、src
  7. Python产生随机数(转)
  8. 根据前序、中序构建二叉树
  9. LibreOJ 6283 数列分块入门 7(区间加区间乘区间求和)
  10. java学生成绩管理系统不使用数据库_java学生成绩管理系统(不用数据库,用txt),写出来有报酬...
  11. python如何进行人口预测_如何使用matlab建立人口预测模型
  12. CentOS7:Ruby安装
  13. 【Flutter--实战】Dart 语言快速入门
  14. 大二学生《Web编程基础》期末网页制作 HTML+CSS个人网页设计实例
  15. 14.VRP介绍以及AC初始化配置_AC和AP的软件升级方法
  16. 高德地图3D轨迹回放 + 视野跟随功能
  17. P4117 [Ynoi2018] 五彩斑斓的世界
  18. 介绍Python/Django的在线好书推荐
  19. 华为EC122(电信) 树莓派3G电信上网总结
  20. UDP 与 GRO, GSO

热门文章

  1. 小女也爱c#(3)--俄罗斯方块练习数组
  2. 数据旋转及DB2递归的应用
  3. explorer.exe被删除了怎么办?
  4. ITPro Magazine2006年第6期发布
  5. Aspx页面javascript的几个trick
  6. Mybatis—多表查询
  7. leetcode 86. 分隔链表(链表)
  8. aws数据库同步区别_了解如何通过使用AWS AppSync构建具有实时数据同步的应用程序
  9. 梯度反传_反事实政策梯度解释
  10. 微信支付商业版 结算周期_了解商业周期