System V IPC:共享内存

共享内存原理

特点
  • 相比管道通信,在读写数据的时候不用切内核态,使通信效率提升
  • 相比命名管道,命名管道是内核管理的缓冲区队列,而共享内存不是队列结构
  • 属于System V IPC(另外两种是信号量消息队列
  • 一种IPC资源,不依赖进程是否存在
原理
  • 进程共享使用同一段物理内存
  • 具有使用权限的进程将共享内存(同一块物理内存)映射到自己地址空间(虚拟地址空间)的一部分
  • 每个共享内存有一个 shmid_ds类型的结构与之对应
struct shmid_ds
{
  uid_t shm_perm.uid;
  uid_t shm_perm.gid;
  mode_t shm_perm.mode;
  
...
}

使用到的API

  • 创建(打开)共享内存--shmget
#include <sys/shm.h>
int shmget(key_t key,size_t size,int shmflg);

参数表
key:共享内存对应键值
size:共享内存大小
shmflg:共享内存权限----IPC_CREATE(创建shm,省略则为打开)|mode(0777)
返回值
大于0:共享内存ID
-1 :出错

  • 连接共享内存--shmat
#include <sys/shm.h>
void * shmat(int shmid,void * shmaddr,int flg);

参数表
shmid:共享内存id号(shmget返回值)
shmaddr:共享内存的起始地址(常用NULL,让内核给分配)
flg:访问共享内存的方式:SHM_RDONLY(读方式)/ 0(可读可写)
返回值
大于0:共享内存起始地址
-1 :出错

  • 解脱共享内存--shmdt
    解脱后shmid_ds结构体中计数器减一(类似文件操作)
#include <sys/shm.h>
int shmdt(void * shmaddr);

参数表
shmaddr:共享内存起始地址(shmat返回值)
返回值
0:成功
-1 :出错

  • 操作(删除)共享内存--shmctl
#include <sys/shm.h>
int shmctl(int shmid,int cmd,struct shmid_ds *buf);

参数表
shmid:共享内存id号
cmd:执行的操作:如 IPC_RMID,删除共享内存
buf:cmd不同,buf不同,删除时填NULL
返回值
0:成功
-1 :出错

示例代码

写端

  1 #include <sys/shm.h>
  2 #include <unistd.h> //sleep
  3 #include <string.h> //strcpy
  4 #include <iostream> //perror
  5 using namespace std;
  6 #define SHM_KEY 98  //设定创建共享内存的键值
  7 
  8 int main()
  9 {
 10         int seg_id;     //共享内存id号
 11         char *mem_ptr = NULL;   //指向共享内存的指针
 12         
 13         seg_id = shmget(SHM_KEY,1024,IPC_CREAT|0777);//创建共享内存:键值,大小,权限
 14         if( seg_id == -1 )
 15         {
 16                 perror( "shmget" );
 17                 exit(EXIT_FAILURE);     
 18         }
 19         
 20 
 21         mem_ptr = (char*)shmat(seg_id,NULL,0);//连接共享内存
 22         if(mem_ptr == NULL)
 23         {
 24                 perror("shmat");
 25                 exit(EXIT_FAILURE);     
 26         }
 27         
 28         
 29         cout << "1" << endl;
 30         char  temp[8] = "1234567";
 31         strcpy(mem_ptr,"1234567\n");
 32 //      cout << sizeof(*mem_ptr) << endl;
 33         cout << "2" << endl;
 34         sleep(10);      //等待读端读数据
 35 
 36         shmctl(seg_id,IPC_RMID,NULL);//删除共享内存
 37         return 0;
 38 } 

读端

  1 #include <sys/shm.h> 
  2 #include <unistd.h> 
  3 #include <string.h> 
  4 #include <iostream>
  5 using namespace std;
  6 
  7 #define SHM_KEY 98
  8 
  9 int main()
 10 {
 11         int seg_id;
 12         
 13         char * mem_ptr;
 14         seg_id = shmget(SHM_KEY,00,0777);
 15         if( seg_id == -1 )
 16         {       
 17                 perror("shmget");
 18                 exit(EXIT_FAILURE);     
 19         }
 20 
 21 
 22         mem_ptr = (char*)shmat(seg_id,NULL,0);
 23         if(mem_ptr == NULL)
 24         {       
 25                 perror("shmat");
 26                 exit(EXIT_FAILURE);     
 27         }
 28         cout << mem_ptr <<endl;
 29 
 30         shmdt(mem_ptr);//共享内存解脱
 31         return 0;       
 32 } 
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,287评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,346评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,277评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,132评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,147评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,106评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,019评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,862评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,301评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,521评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,682评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,405评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,996评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,651评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,803评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,674评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,563评论 2 352