新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 進程間通信之: 共享內存

        進程間通信之: 共享內存

        作者: 時間:2013-09-13 來源:網絡 收藏

        本文引用地址:http://www.104case.com/article/257124.htm

        8.5

        8.5.1概述

        可以說,是一種最為高效的方式。因為進程可以直接讀寫內存,不需要任何數據的復制。為了在多個進程間交換信息,內核專門留出了一塊內存區。這段內存區可以由需要訪問的進程將其映射到自己的私有地址空間。因此,進程就可以直接讀寫這一內存區而不需要進行數據的復制,從而大大提高了效率。當然,由于多個進程共享一段內存,因此也需要依靠某種同步機制,如互斥鎖和信號量等(請參考本章的共享內存實驗)。其原理示意圖如圖8.8所示。

        圖8.8共享內存原理示意圖

        8.5.2共享內存的應用

        1.函數說明

        共享內存的實現分為兩個步驟,第一步是創建共享內存,這里用到的函數是shmget(),也就是從內存中獲得一段共享內存區域,第二步映射共享內存,也就是把這段創建的共享內存映射到具體的進程空間中,這里使用的函數是shmat()。到這里,就可以使用這段共享內存了,也就是可以使用不帶緩沖的I/O讀寫命令對其進行操作。除此之外,當然還有撤銷映射的操作,其函數為shmdt()。這里就主要介紹這3個函數。

        2.函數格式

        表8.20列舉了shmget()函數的語法要點。

        表8.20 shmget()函數語法要點

        所需頭文件

        #includesys/types.h>
        #includesys/ipc.h>
        #includesys/shm.h>

        函數原型

        intshmget(key_tkey,intsize,intshmflg)

        函數傳入值

        key:共享內存的鍵值,多個進程可以通過它訪問同一個共享內存,其中有個特殊值IPC_PRIVATE。它用于創建當前進程的私有共享內存

        size:共享內存區大小

        shmflg:同open()函數的權限位,也可以用八進制表示法

        函數返回值

        成功:共享內存段標識符

        出錯:-1

        表8.21列舉了shmat()函數的語法要點。

        表8.21 shmat()函數語法要點

        所需頭文件

        #includesys/types.h>
        #includesys/ipc.h>
        #includesys/shm.h>

        函數原型

        char*shmat(intshmid,constvoid*shmaddr,intshmflg)

        函數傳入值

        shmid:要映射的共享內存區標識符

        shmaddr:將共享內存映射到指定地址(若為0則表示系統自動分配地址并把該段共享內存映射到調用進程的地址空間)

        shmflg

        SHM_RDONLY:共享內存只讀

        默認0:共享內存可讀寫

        函數返回值

        成功:被映射的段地址

        出錯:-1

        表8.22列舉了shmdt()函數的語法要點。

        表8.22 shmdt()函數語法要點

        所需頭文件

        #includesys/types.h>
        #includesys/ipc.h>
        #includesys/shm.h>

        函數原型

        intshmdt(constvoid*shmaddr)

        函數傳入值

        shmaddr:被映射的共享內存段地址

        函數返回值

        成功:0

        出錯:-1

        linux操作系統文章專題:linux操作系統詳解(linux不再難懂)

        上一頁 1 2 3 下一頁

        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 霍邱县| 永宁县| 建宁县| 新乡市| 正蓝旗| 南木林县| 北宁市| 元谋县| 林西县| 二手房| 禄丰县| 海城市| 左云县| 安远县| 阿合奇县| 房产| 平阴县| 泊头市| 海伦市| 松滋市| 全州县| 巨野县| 尚义县| 门源| 吉隆县| 葵青区| 邻水| 阳江市| 乐清市| 金秀| 梅州市| 灌云县| 丹凤县| 文水县| 济阳县| 西华县| 阿瓦提县| 平潭县| 松阳县| 黎川县| 桂东县|