共享内存通讯编程
2015-08-10 17:36
267 查看
共享内存是IPC机制中的一种。它允许两个不相关的进程访问同一段内存,这是传递数据的一种非常有效的方式。
shmget函数创建的共享内存返回的是其描述符id,要想使用该共享内存,还需要将创建的共享内存映射到调用该函数的进程的内存空间,使用的函数为shmat。
进程B:获取共享内存并映射到自己进程的内存地址,读取共享内存的数据,读取完断开与共享内存的映射并删除共享内存。
shmget函数
原型:int shmget(key_t key,size_t size,int shmflg) 头文件:<sys/ipc.h><sys/shm.h> 功能:创建/获取一个共享内存,成功则返回共享内存的描述符id,失败返回-1 参数:key:键值 size:创建的共享内存大小 shmflg:打开标志。如值为IPC_CREAT,则会创建一个新的共享内存
shmget函数创建的共享内存返回的是其描述符id,要想使用该共享内存,还需要将创建的共享内存映射到调用该函数的进程的内存空间,使用的函数为shmat。
shmat函数
原型:void *shmat(int shmid,const void *shmaddr,int shmflg) 头文件:<sys/types.h><sys/shm.h> 功能:将共享内存连接到调用该函数的进程的地址空间,成功返回映射后的地址,失败返回-1 参数:shmid:共享内存的描述符 shmaddr:可以使用该参数来指定映射的地址,但一般设为NULL,让操作系统选择一块没有使用的内存地址来进行映射 shmflg:状态标志
shmdt函数
原型:int shmdt(const void *shmaddr) 头文件:<sys/types.h><sys/shm.h> 功能:与shmat对立,用来脱离与共享内存的连接映射。成功返回0,失败返回-1 参数:shmaddr:需要与共享内存脱离映射的进程内存地址
shmctl
原型:int shmctl(int shmid,int cmd,struct shmid_ds *buf) 头文件:<sys/ipc.h><sys/shm.h> 功能:根据cmd的值对共享内存进行不同的操作。操作失败返回-1 参数:shmid:共享内存描述符id cmd:操作命令,如为IPC_RMID,则表示删除共享内存。 buf:在Linux系统中每个共享内存都有一个struct shmid_ds来对应描述该共享内存。shmctl函数中buf用于获取Linux描述该贡献内存的struct shmid_ds,但是一般不使用
实例
进程A:创建共享内存并映射到自己进程的内存地址,然后往共享内存写入数据。写完后断开映射。#include<sys/ipc.h> #include<sys/shm.h> #include<sys/types.h> #include<stdio.h> #include<string.h> typedef struct { int mem_flg; char buff[1024]; }shared_mem,*shared_mem_ptr; void main() { /*创建共享内存*/ key_t key=ftok("/home/jx/processA",1); int shmid=shmget(key,sizeof(shared_mem),IPC_CREAT); /*映射共享内存*/ shared_mem_ptr shm_ptr; shm_ptr=(shared_mem_ptr)shmat(shmid,NULL,0); shm_ptr->mem_flg=0; /*往共享内存写入数据*/ int running=1; while(running) { if(shm_ptr->mem_flg==0) { scanf("%s",shm_ptr->buff); shm_ptr->mem_flg=1; int a=strcmp(shm_ptr->buff,"exit"); if(a==0) running=0; } } /*断开映射*/ shmdt((const void*)shm_ptr); }
进程B:获取共享内存并映射到自己进程的内存地址,读取共享内存的数据,读取完断开与共享内存的映射并删除共享内存。
#include<sys/ipc.h> #include<sys/shm.h> #include<sys/types.h> #include<stdio.h> #include<string.h> typedef struct { int mem_flg; char buff[1024]; }shared_mem,*shared_mem_ptr; void main() { /*获取共享内存*/ key_t key=ftok("/home/jx/processA",1); int shmid=shmget(key,sizeof(shared_mem),IPC_CREAT); /*映射共享内存*/ shared_mem_ptr shm_ptr; shm_ptr=(shared_mem_ptr)shmat(shmid,NULL,0); /*读取共享内存数据*/ int running=1; while(running) { if(shm_ptr->mem_flg==1) { printf("%s\n",shm_ptr->buff); shm_ptr->mem_flg=0; int a=strcmp(shm_ptr->buff,"exit"); if(a==0) running=0; } } /*断开映射*/ shmdt((const void*)shm_ptr); /*删除共享内存*/ struct shmid_ds *buf; shmctl(shmid,IPC_RMID,buf); }
相关文章推荐
- 46 个非常有用的 PHP 代码片段
- Java文件拆分与合并
- 安装 Django
- 趣味数学应用:求小球在一条斜线上的运动轨迹
- C#图片水印类
- python中的exec()函数的作用
- C#实现的XML操作类实例
- Lua中table的拷贝问题
- ThinkPHP去除url中的index.php
- ASP.NET(C#)图片加文字、图片水印,神啊,看看吧
- Using Ogre paint Widget of QT
- php如何将webp格式图片转为jpeg(ImageMagick+libwebp)
- C++中new是否进行初始化的问题
- C#集合类型
- java.lang.IllegalStateException: Optional int parameter 'currentSpecialIndex' is present but cannot
- Java Web基础——自定义标签和JSTL
- 【Java并发编程实战】—–“J.U.C”:锁,lock
- 在线QQ代码设置
- C++_布局(placement)new操作符
- Eclipse的java代码出错:The import XXXX cannot be resolved