linux共享記憶體和windows的共享記憶體邏輯上有很大區別,要注意一下幾點
標識描述
ipc_excl
這個加入後,如果已經存在標識為key的共享記憶體則報錯返回-1
0如果是0 的話,就可以實現,如果共享記憶體不存在則返回失敗-1,否則直接建立返回成功
0666
這個識別符號很多人不知道啥意思,其實試試就知道了,它可以讓你在普通使用者下建立訪問共享記憶體,如果沒有這個標識,共享記憶體的建立和訪問都必須在root使用者下進行,參考《unix環境高階程式設計第二版》,裡面有#define shm_mode 0600 /* user read/write */
共享記憶體想完全銷毀,需要滿足兩個條件
應用計數為0,shmat/shmdt
標記為刪除,shmctl
如果引用計數不為0,你刪除了,那麼這個共享記憶體還在,還可以讀取裡面的值,但是共享記憶體的標記已經刪除,所以後續程式無法開啟,找不到共享記憶體
如果引用計數為0,但是你沒標記刪除,那麼共享記憶體標記和空間都還在,可以訪問並讀取記憶體,造成記憶體洩露,注意了
首先是建立共享記憶體
/*
file: sharemem.c
author: magicdmer
*/#include #include #include #include #include #include int main()
perror("shmid:%u\n",key);
/*這裡要注意了,ipc_excl這個的作用是:如果存在這個共享記憶體了就返回失敗
如果不加這個,會一直成功,會直接開啟已有的
*/shmid = shmget(key,1,ipc_creat|ipc_excl);
if (shmid == -1)
shm_addr = shmat(shmid, null, 0);
if (shm_addr == -1)
memcpy(shm_addr,"y",1);
getchar();
if (shmdt(shm_addr) == -1)
if (shmctl(shmid, ipc_rmid, 0) == -1)
return 0;
}
然後是讀寫共享記憶體
/*
file: sharemem.c
author: magicdmer
*/#include #include #include #include #include #include int main()
//這裡要注意了,最後乙個flag設定成0,這樣,如果共享記憶體不存在就會報錯,不然即使沒有也直接建立了
shmid = shmget(key,1,0);
if (shmid == -1)
shm_addr = shmat(shmid, null, 0);
if (shm_addr == (void *)-1)
char tmp[10];
bzero(tmp, 10);
memcpy(tmp,shm_addr,1);
printf("read from shared memory:%s\n",tmp);
getchar();
bzero(tmp, 10);
memcpy(tmp,shm_addr,1);
printf("read from shared memory:%s\n",tmp);
if (shmdt(shm_addr) == -1)
}
Linux 使用共享記憶體
1.共享記憶體與訊息佇列的區別 訊息佇列在實現訊息的收發時,首先由傳送程序從程序空間將資料複製到核心分配的資料緩衝區中,接受程序再從核心的緩衝區複製到程序的虛擬位址空間 共享記憶體是將核心分配的共享儲存區域對映到程序的位址空間實現的,沒有資料的複製過程,共享記憶體的訪問速度要比訊息佇列快 2.共享記...
Linux共享記憶體的使用 二
訊號量訊號量是乙個記憶體變數,可以被系統中的任何程序所訪問。為什麼引入訊號量大家可以考慮這個問題.在使用共享記憶體的時候,如果客戶端在讀取資料時,恰好伺服器端也在寫資料,那麼就會出現問題。如何解決呢?出現讀寫衝突的問題,可通過訊號量機制,保證讀寫共享記憶體段互斥進行加以解決。linux中的訊號量li...
linux共享記憶體使用例項
三個檔案,乙個標頭檔案,乙個讀,乙個寫,用同乙個key值申請共享記憶體。shm.h ifndef shm com h define shm com h 1 define text sz 2048 struct shared use at struct kts endif shm write.c in...