~共享記憶體概述:
共享記憶體,就是允許兩個或者多個不同的程序訪問同乙個給定的記憶體,因為資料不需要在程序複製,所以共享記憶體是最快的一種ipc,不同的程序將同一段物理位址對映到各自的程序中,如果乙個程序向共享記憶體寫資料,所做的改動將立即影響到可以訪問同一段共享記憶體的任何其他程序。
~注:當乙個程序在共享記憶體處寫入資料時不應該別的程序去讀(共享記憶體不提供同步機制)。
~注:它往往與其他通訊機制,如訊號量,配合使用,來實現程序間的同步和通訊。
1,共享記憶體相關的api
#include
#include
intshmget
(key_t key, size_t size,
int shm***)
;//獲取共享記憶體
//引數1:系統使用共享記憶體時必須有id號(用ftok獲取)
//引數2:龔翔記憶體空間(以1024byte為單位);
//引數3:一般為ipc_creat|0600建立乙個鍵值和key相等的可讀可寫的記憶體
void
*shmat
(int shmid,
const
void
*shmaddr,
int shm***)
;//將共享記憶體對映到改程序的位址空間中
//引數1:共享記憶體的識別符號(id)
//引數3:shm_rdonly讀唯讀模式其他為讀寫
intshmdt
(const
void
*shmaddr)
;//禁止共享記憶體連線到程序位址空間
intshmctl
(int shmid,
int cmd,
struct shmid_ds *buf)
;//對共享記憶體進行移除等控制
//引數1:shm_id是shmget函式返回的共享記憶體識別符號。
//引數2:command是要採取的操作,它可以取下面的三個值 :
ipc_stat:把shmid_ds結構中的資料設定為共享記憶體的當前關聯值,即用共享記憶體的當前關聯值覆蓋shmid_ds的值。
ipc_set:如果程序有足夠的許可權,就把共享記憶體的當前關聯值設定為shmid_ds結構中給出的值
ipc_rmid:刪除共享記憶體段
//引數3:buf是乙個結構指標,它指向共享記憶體模式和訪問許可權的結構。
shmid_ds結構至少包括以下成員:
2,共享記憶體簡單的**實現;
read.c檔案用於讀共享記憶體資料,write.c用於往共享記憶體中寫資料(寫入hello world!)。
write.c檔案如下:
#include
#include
#include
#include
#include
intmain()
shmaddr =
shmat
(shmid,0,
0);//對映共享記憶體位址到該程序的位址空間
strcpy
(shmaddr,
"hello world!");
sleep(5
);//等待5s讓別的程序讀取記憶體資料
shmdt
(shmaddr)
;//和該程序解除位址對映
shmctl
(shmid,ipc_rmid,0)
;//刪除共享記憶體,不關心它的刪除返回值
read.c檔案**如下:
#include
#include
#include
#include
intmain()
shmaddr =
shmat
(shmid,0,
0);printf
("shmat ok!\n");
printf
("data = %s\n"
,shmaddr)
;shmdt
(shmaddr)
;return0;
}
注:先讓write.c先寫入共享記憶體,然後read.c去讀,保證在5秒內不然read會報錯(在write執行5秒後移除了共享記憶體)
注:ipc中鍵值的作用:
程序間的通訊,必須要有個公共的標識來確保使用同一通訊通道(比如通道為共享記憶體),然後再把這個標識與某個共享記憶體進行繫結,任何乙個程序如果使用相同乙個標識,則核心就可以通過標識來找到對應的那段共享記憶體,這個標識就是鍵值。如果沒有鍵值,乙個程序開啟或者建立乙個共享記憶體並返回id,但是其他想要通訊的程序不知道這個共享記憶體的id是多少,所以就不能通訊了。
命令擴充套件
ipcs -m//檢視共享儲存段
ipcrm -m [shmid]
//刪除系統共享儲存段
《Linux系統程式設計 程序間通訊 共享記憶體》
共享記憶體是程序間通訊中最簡單的方式之一。共享記憶體允許兩個或更多程序訪問同一塊記憶體,就如同 malloc 函式向不同程序返回了指向同乙個物理記憶體區域的指標。當乙個程序改變了這塊位址中的內容的時候,其它程序都會察覺到這個更改。共享記憶體的特點 1 共享記憶體是程序間共享資料的一種最快的方法。乙個...
系統程式設計之程序通訊 共享記憶體
shm com.h define text sz 2048 struct shared use st shm1.c 讀程序 include include include include include include include include shm com.h int main void ...
linux系統程式設計 實現共享記憶體
一 相關的api 1 shmget 建立或者獲取乙個共享記憶體,成功返回共享記憶體id,失敗返回 1。建立共享記憶體 man手冊 man 2 shmget key t 輸入 key就可以 size 共享記憶體的大小以兆對齊 flag 開啟佇列的方式,一般為ipc creat man手冊 man 2 ...