天天看點

Linux IPC實踐(9) --System V共享記憶體

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:指向一個儲存着共享記憶體的模式狀态和通路權限的資料結構

Linux IPC實踐(9) --System V共享記憶體

System V共享記憶體小結:

   1.共享記憶體被别的程式占用,則删除該共享記憶體時,不會馬上删除(引用計數計數);

   2.此時會出現一個現象:該共享記憶體的key變為0x00000000,變為私有;

   3.此時還可以讀,但必須還有辦法擷取該共享記憶體的ID(shmid),因為此時試圖通過該共享記憶體的key擷取該共享記憶體,是白費的!

繼續閱讀