1.簡介
共享內存是一種最為高效的進程間通信方式,進程可以直接讀寫內存,而不需要任何數據的拷貝.為了在多個進程間交換信息,內核專門留出了一塊內存區,可以由需要訪問的進程將其映射到自己的私有地址空間.進程就可以直接讀寫這一內存區而不需要進行數據的拷貝,從而大大提高的效率.由於多個進程共享一段內存,因此也需要依靠某種同步機制,如互斥鎖和信號量等.
2.共享內存實現的步驟
創建共享內存,這裡用到的函數是shmget,也就是從內存中獲得一段共享內存區域;
映射共享內存,也就是把這段創建的共享內存映射到具體的進程空間中去,這裡使用的函數是shmat;
到這裡,就可以使用這段共享內存了,也就是可以使用不帶緩沖的I/O讀寫命令對其進行操作;
撤銷映射的操作,其函數為shmdt.
調用shmgat的過程相當於映射文件系統shm中的同名文件過程,原理和mmap大同小異,但使用更加方便.
3.shmget系統調用
該系統調用獲得(或新建)一個共享內存區域,調用成功返回該區域的ID,即shmid,若出錯則返回-1.shmget函數語法:
注意:共享內存,消息隊列和信號量是由內核維護的進程間通信方式,它們一IPC結構的結構存在於內核中,在內部以標示符加以應用,而在外部則通過鍵值引用.鍵的數據結構為key_t類型,由內核負責將它轉換為標示符.命令ipcs可以提供系統中所有的共享內存,消息隊列和信號量的標示符和鍵.
4.shmat系統調用
該系統調用將shmget返回的區域映射到進程的內存空間中.shmat函數語法:
5.shmdt系統調用
該系統調用解除被共享內存區域與進程地址addr的映射關系.shmdt函數語法:
更多詳情請繼續閱讀第2頁的內容:http://www.linuxidc.com/Linux/2013-10/91442p2.htm