shmget
建立共享記憶體,并将該記憶體的内容初始化為0;
打開一個已經存在共享記憶體, 如果打開時不知道共享記憶體的大小, 可以将size指定為0, shmflg可以指定為0(按照預設的權限打開);
參數:
key:這個共享記憶體段名字;
size:共享記憶體大小(bytes);
shmflg:用法類似msgget中的msgflg參數;
傳回值:
成功傳回一個非負整數,即該共享記憶體段的辨別碼;失敗傳回-1
shmat
連接配接到本程序位址空間, 成功連接配接之後, 對該記憶體的操作就與malloc來的一塊記憶體非常類似了, 而且如果這塊記憶體中有資料, 則就可以直接将其中的資料取出來!!
shmaddr:指定連接配接的位址(推薦使用NULL)
shmflg:一般指定為0, 表示可讀,可寫; 而它的另外兩個可能取值是SHM_RND和SHM_RDONLY(見下)
傳回值:
成功傳回一個指針,指向共享記憶體起始位址;失敗傳回(void *) -1
shmaddr與shmflg組合說明
shmaddr為NULL
Linux核心自動為程序連接配接到程序的記憶體(推薦使用)
shmaddr不為NULL且shmflg無SHM_RND标記
以shmaddr為連接配接位址
shmaddr不為NULL且shmflg設定了SHM_RND标記
連接配接的位址會自動向下調整為SHMLBA的整數倍;
公式:shmaddr - (shmaddr % SHMLBA)
SHMLBA為記憶體頁面的大小(4K)
shmflg=SHM_RDONLY
隻讀共享記憶體, 不然的話就是可讀,可寫的, 注意: 此處沒有可讀,可寫這個概念
shmdt
shmaddr: 由shmat所傳回的指針
注意:将共享記憶體段與目前程序脫離不等于删除共享記憶體段
shmctl
設定/擷取共享記憶體屬性
cmd:将要采取的動作(三個取值見下)
buf:指向一個儲存着共享記憶體的模式狀态和通路權限的資料結構

System V共享記憶體小結:
1.共享記憶體被别的程式占用,則删除該共享記憶體時,不會馬上删除(引用計數計數);
2.此時會出現一個現象:該共享記憶體的key變為0x00000000,變為私有;
3.此時還可以讀,但必須還有辦法擷取該共享記憶體的ID(shmid),因為此時試圖通過該共享記憶體的key擷取該共享記憶體,是白費的!