System V IPC:共享內(nèi)存

共享內(nèi)存原理

特點(diǎn)
  • 相比管道通信陡厘,在讀寫(xiě)數(shù)據(jù)的時(shí)候不用切內(nèi)核態(tài)导披,使通信效率提升
  • 相比命名管道舵鳞,命名管道是內(nèi)核管理的緩沖區(qū)隊(duì)列,而共享內(nèi)存不是隊(duì)列結(jié)構(gòu)
  • 屬于System V IPC(另外兩種是信號(hào)量消息隊(duì)列
  • 一種IPC資源狡孔,不依賴(lài)進(jìn)程是否存在
原理
  • 進(jìn)程共享使用同一段物理內(nèi)存
  • 具有使用權(quán)限的進(jìn)程將共享內(nèi)存(同一塊物理內(nèi)存)映射到自己地址空間(虛擬地址空間)的一部分
  • 每個(gè)共享內(nèi)存有一個(gè) shmid_ds類(lèi)型的結(jié)構(gòu)與之對(duì)應(yīng)
struct shmid_ds
{
  uid_t shm_perm.uid;
  uid_t shm_perm.gid;
  mode_t shm_perm.mode;
  
...
}

使用到的API

  • 創(chuàng)建(打開(kāi))共享內(nèi)存--shmget
#include <sys/shm.h>
int shmget(key_t key,size_t size,int shmflg);

參數(shù)表
key:共享內(nèi)存對(duì)應(yīng)鍵值
size:共享內(nèi)存大小
shmflg:共享內(nèi)存權(quán)限----IPC_CREATE(創(chuàng)建shm懂诗,省略則為打開(kāi))|mode(0777)
返回值
大于0:共享內(nèi)存ID
-1 :出錯(cuò)

  • 連接共享內(nèi)存--shmat
#include <sys/shm.h>
void * shmat(int shmid,void * shmaddr,int flg);

參數(shù)表
shmid:共享內(nèi)存id號(hào)(shmget返回值)
shmaddr:共享內(nèi)存的起始地址(常用NULL,讓內(nèi)核給分配)
flg:訪問(wèn)共享內(nèi)存的方式:SHM_RDONLY(讀方式)/ 0(可讀可寫(xiě))
返回值
大于0:共享內(nèi)存起始地址
-1 :出錯(cuò)

  • 解脫共享內(nèi)存--shmdt
    解脫后shmid_ds結(jié)構(gòu)體中計(jì)數(shù)器減一(類(lèi)似文件操作)
#include <sys/shm.h>
int shmdt(void * shmaddr);

參數(shù)表
shmaddr:共享內(nèi)存起始地址(shmat返回值)
返回值
0:成功
-1 :出錯(cuò)

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

參數(shù)表
shmid:共享內(nèi)存id號(hào)
cmd:執(zhí)行的操作:如 IPC_RMID,刪除共享內(nèi)存
buf:cmd不同苗膝,buf不同殃恒,刪除時(shí)填NULL
返回值
0:成功
-1 :出錯(cuò)

示例代碼

寫(xiě)端

  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  //設(shè)定創(chuàng)建共享內(nèi)存的鍵值
  7 
  8 int main()
  9 {
 10         int seg_id;     //共享內(nèi)存id號(hào)
 11         char *mem_ptr = NULL;   //指向共享內(nèi)存的指針
 12         
 13         seg_id = shmget(SHM_KEY,1024,IPC_CREAT|0777);//創(chuàng)建共享內(nèi)存:鍵值,大小荚醒,權(quán)限
 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);//連接共享內(nèi)存
 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);      //等待讀端讀數(shù)據(jù)
 35 
 36         shmctl(seg_id,IPC_RMID,NULL);//刪除共享內(nèi)存
 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);//共享內(nèi)存解脫
 31         return 0;       
 32 } 
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末芋类,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子界阁,更是在濱河造成了極大的恐慌侯繁,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,657評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件泡躯,死亡現(xiàn)場(chǎng)離奇詭異贮竟,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)较剃,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,889評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門(mén)咕别,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人写穴,你說(shuō)我怎么就攤上這事惰拱。” “怎么了啊送?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,057評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵偿短,是天一觀的道長(zhǎng)欣孤。 經(jīng)常有香客問(wèn)我,道長(zhǎng)昔逗,這世上最難降的妖魔是什么降传? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,509評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮勾怒,結(jié)果婚禮上婆排,老公的妹妹穿的比我還像新娘。我一直安慰自己笔链,他們只是感情好段只,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,562評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著卡乾,像睡著了一般翼悴。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上幔妨,一...
    開(kāi)封第一講書(shū)人閱讀 51,443評(píng)論 1 302
  • 那天,我揣著相機(jī)與錄音谍椅,去河邊找鬼误堡。 笑死,一個(gè)胖子當(dāng)著我的面吹牛雏吭,可吹牛的內(nèi)容都是我干的锁施。 我是一名探鬼主播,決...
    沈念sama閱讀 40,251評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼杖们,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼悉抵!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起摘完,我...
    開(kāi)封第一講書(shū)人閱讀 39,129評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤姥饰,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后孝治,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體列粪,經(jīng)...
    沈念sama閱讀 45,561評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,779評(píng)論 3 335
  • 正文 我和宋清朗相戀三年谈飒,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了岂座。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,902評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡杭措,死狀恐怖费什,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情手素,我是刑警寧澤鸳址,帶...
    沈念sama閱讀 35,621評(píng)論 5 345
  • 正文 年R本政府宣布赘那,位于F島的核電站,受9級(jí)特大地震影響氯质,放射性物質(zhì)發(fā)生泄漏募舟。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,220評(píng)論 3 328
  • 文/蒙蒙 一闻察、第九天 我趴在偏房一處隱蔽的房頂上張望拱礁。 院中可真熱鬧,春花似錦辕漂、人聲如沸呢灶。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,838評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)鸯乃。三九已至,卻和暖如春跋涣,著一層夾襖步出監(jiān)牢的瞬間缨睡,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,971評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工陈辱, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留奖年,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,025評(píng)論 2 370
  • 正文 我出身青樓沛贪,卻偏偏與公主長(zhǎng)得像陋守,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子利赋,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,843評(píng)論 2 354