歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> Linux下多任務間通信和同步-System V共享內存

Linux下多任務間通信和同步-System V共享內存

日期:2017/3/1 9:52:07   编辑:Linux編程

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

Copyright © Linux教程網 All Rights Reserved