<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 進(jìn)程間通信之: 共享內(nèi)存

          進(jìn)程間通信之: 共享內(nèi)存

          作者: 時(shí)間:2013-09-13 來(lái)源:網(wǎng)絡(luò) 收藏

          本文引用地址:http://www.ex-cimer.com/article/257124.htm

          8.5

          8.5.1概述

          可以說(shuō),是一種最為高效的方式。因?yàn)檫M(jìn)程可以直接讀寫(xiě)內(nèi)存,不需要任何數(shù)據(jù)的復(fù)制。為了在多個(gè)進(jìn)程間交換信息,內(nèi)核專(zhuān)門(mén)留出了一塊內(nèi)存區(qū)。這段內(nèi)存區(qū)可以由需要訪問(wèn)的進(jìn)程將其映射到自己的私有地址空間。因此,進(jìn)程就可以直接讀寫(xiě)這一內(nèi)存區(qū)而不需要進(jìn)行數(shù)據(jù)的復(fù)制,從而大大提高了效率。當(dāng)然,由于多個(gè)進(jìn)程共享一段內(nèi)存,因此也需要依靠某種同步機(jī)制,如互斥鎖和信號(hào)量等(請(qǐng)參考本章的共享內(nèi)存實(shí)驗(yàn))。其原理示意圖如圖8.8所示。

          圖8.8共享內(nèi)存原理示意圖

          8.5.2共享內(nèi)存的應(yīng)用

          1.函數(shù)說(shuō)明

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

          2.函數(shù)格式

          表8.20列舉了shmget()函數(shù)的語(yǔ)法要點(diǎn)。

          表8.20 shmget()函數(shù)語(yǔ)法要點(diǎn)

          所需頭文件

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

          函數(shù)原型

          intshmget(key_tkey,intsize,intshmflg)

          函數(shù)傳入值

          key:共享內(nèi)存的鍵值,多個(gè)進(jìn)程可以通過(guò)它訪問(wèn)同一個(gè)共享內(nèi)存,其中有個(gè)特殊值IPC_PRIVATE。它用于創(chuàng)建當(dāng)前進(jìn)程的私有共享內(nèi)存

          size:共享內(nèi)存區(qū)大小

          shmflg:同open()函數(shù)的權(quán)限位,也可以用八進(jìn)制表示法

          函數(shù)返回值

          成功:共享內(nèi)存段標(biāo)識(shí)符

          出錯(cuò):-1

          表8.21列舉了shmat()函數(shù)的語(yǔ)法要點(diǎn)。

          表8.21 shmat()函數(shù)語(yǔ)法要點(diǎn)

          所需頭文件

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

          函數(shù)原型

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

          函數(shù)傳入值

          shmid:要映射的共享內(nèi)存區(qū)標(biāo)識(shí)符

          shmaddr:將共享內(nèi)存映射到指定地址(若為0則表示系統(tǒng)自動(dòng)分配地址并把該段共享內(nèi)存映射到調(diào)用進(jìn)程的地址空間)

          shmflg

          SHM_RDONLY:共享內(nèi)存只讀

          默認(rèn)0:共享內(nèi)存可讀寫(xiě)

          函數(shù)返回值

          成功:被映射的段地址

          出錯(cuò):-1

          表8.22列舉了shmdt()函數(shù)的語(yǔ)法要點(diǎn)。

          表8.22 shmdt()函數(shù)語(yǔ)法要點(diǎn)

          所需頭文件

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

          函數(shù)原型

          intshmdt(constvoid*shmaddr)

          函數(shù)傳入值

          shmaddr:被映射的共享內(nèi)存段地址

          函數(shù)返回值

          成功:0

          出錯(cuò):-1

          linux操作系統(tǒng)文章專(zhuān)題:linux操作系統(tǒng)詳解(linux不再難懂)

          上一頁(yè) 1 2 3 下一頁(yè)

          評(píng)論


          相關(guān)推薦

          技術(shù)專(zhuān)區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();