linux 程序間通訊之共享記憶體方式。共享記憶體方式:從物理記憶體裡面拿出來一部分作為多個程序共享。
共享記憶體是程序間共享資料的一種最快的方法,乙個程序向共享記憶體區域寫入資料,共享這個記憶體的所有程序都可以立即看到其中內容。
共享記憶體實現步驟:
一、建立共享記憶體,使用shmget函式。
二、對映共享記憶體,將這段建立的共享記憶體對映到具體的程序空間去,使用shmat函式。
建立共享記憶體shmget:
intshmget(key_t key, size_t size, int shm***)
功能:得到乙個共享記憶體識別符號或建立乙個共享記憶體物件並返回共享記憶體識別符號。
key:0(ipc_private)會建立共享記憶體物件
size:大於0的整數,新建共享記憶體的大小,以位元組為單位。只獲取共享記憶體時,指定為0.
shm***:
0表示取共享記憶體識別符號,如不存在則函式會報錯;
ipc_creat,如果核心中不存在鍵值與key相等的共享記憶體時,則建立乙個共享記憶體;如果存在這樣的共享記憶體則返回共享記憶體的識別符號;
ipc_creat|ipc_excl:如果核心中不存在鍵值與key相等的共享記憶體,則新建乙個訊息佇列;如果存在這樣的共享記憶體則報錯;
函式返回值:成功則返回記憶體的識別符號;出錯則返回-1,錯誤原因存在於error中
對映共享記憶體到呼叫程序的位址空間shmat:
void*shmat(int shmid, const void *shmaddr, int shm***)
msqid:共享記憶體識別符號
shmaddr:指定共享記憶體出現在程序記憶體位址的什麼位置,直接指定為null讓核心自己決定乙個合適的位址位置。
shm***:shm_rdonly 唯讀模式,其他為讀寫模式
函式返回值:成功則返回附加好的共享記憶體位址;出錯返回-1,錯誤原因存在於error中
斷開共享記憶體連線shmdt:
intshmdt(const void *shmaddr)
功能:傳入shmaddr,連線共享的記憶體起始位址;斷開成功則返回0,出錯則返回-1,錯誤原因存在於error中。
父子程序間通訊例項:
#include
#include
#include
#include
#include
#include
int main(int argc, char **ar**){
if(argc< 2){ //需要輸入共享的資料
printf("pleaseinput the shared data.\n");
exit(-1);
intshmid;
shmid= shmget(0,1024,ipc_creat);
if(shmid== -1){ //申請共享記憶體失敗
printf("createshare memory failed.\n");
exit(-1);
if(fork()){ //父程序之中
char*p_shmaddr;
p_shmaddr= shmat(shmid, null, 0); //對映到父程序之中的乙個位址
memset(p_shmaddr,0, 1024); //初始化共享記憶體
strcpy(p_shmaddr,ar**[1]); //拷貝共享資料到共享記憶體
wait(null); //等待子程序結束
exit(0);
else{
sleep(2); //等待父程序寫入資料
char*c_shmaddr;
c_shmaddr= shmat(shmid,null,0); //對映到子程序之中乙個位址,具體由kernel指配
printf("theshare data is: %s\n", c_shmaddr); //子程序輸出共享的資料
exit(0);
linux程序間通訊之共享記憶體
共享記憶體塊提供了在任意數量的程序之間進行高效雙向通訊的機制。每個使用者都可以讀取寫入資料,但是所有程式之間必須達成並遵守一定的協議,以防止諸如在讀取資訊之前覆寫記憶體空間等競爭狀態的出現。不幸的是,linux無法嚴格保證提供對共享記憶體塊的獨佔訪問,甚至是在您通過使用ipc private建立新的...
Linux 程序間通訊之共享記憶體
1.什麼是共享記憶體?2.共享記憶體優缺點 優點 採用共享記憶體的乙份好處是效率高,因為程序可以直接讀寫空間,不需要資料拷貝,而訊息佇列與管道都經過了2次拷貝,寫端寫的時候往佇列拷貝乙份,讀端讀的時候又拷貝了乙份。缺點 以前的程序間通訊都自帶同步互斥機制,但共享記憶體並沒有,需要自己加鎖。3.實現 ...
linux程序間通訊之共享記憶體
共享記憶體可以說是最有用的程序間通訊方式,也是最快的ipc形式。兩個不同程序a b共享記憶體的意思是,同一塊物理記憶體被對映到程序a b各自的程序位址空間。程序a可以即時看到程序b對共享記憶體中資料的更新,反之亦然。由於多個程序共享同一塊記憶體區域,必然需要某種同步機制,互斥鎖和訊號量都可以。採用共...