Linux 處理序間通訊 - 共用記憶體shmget方式

來源:互聯網
上載者:User

標籤:style   blog   http   ar   color   使用   sp   strong   檔案   

     共用記憶體地區是被多個進程共用的一部分實體記憶體。如果多個進程都把該記憶體區域對應到自己的虛擬位址空間,則這些進程就都可以直接存取該共用記憶體地區,從而可以通過該地區進行通訊。共用記憶體是進程間共用資料的一種最快的方法,一個進程向共用記憶體地區寫入了資料,共用這個記憶體地區的所有進程就可以立刻看到其中的內容。這塊共用虛擬記憶體的頁面,出現在每一個共用該頁面的進程的頁表中。但是它不需要在所有進程的虛擬記憶體中都有相同的虛擬位址

 

 

 

 

 

 

以下是使用共用記憶體機制進行處理序間通訊的基本操作:

 

需要包含的標頭檔:

#include <sys/types.h>

#include <sys/ipc.h>

#include <sys/shm.h>

1.建立共用記憶體:

 int shmget(key_t key,int size,int shmflg);

參數說明:

key:用來表示建立或者已經存在的共用記憶體去的關鍵字。

size:建立共用記憶體的大小。

shmflg:可以指定的特殊標誌。IPC_CREATE,IPC_EXCL以及低九位的許可權。

eg:

int shmid;

shmid=shmget(IPC_PRIVATE,4096,IPC_CREATE|IPC_EXCL|0660);

if(shmid==-1)

perror("shmget()");

 

2.串連共用記憶體

char *shmat(int shmid,char *shmaddr,int shmflg);

參數說明

shmid:共用記憶體的關鍵字

shmaddr:指定共用記憶體出現在進程記憶體位址的什麼位置,通常我們讓核心自己決定一個合適的地址位置,用的時候設為0。

shmflg:制定特殊的標誌位。SHM_RDONLY:為唯讀模式,其他為讀寫入模式,一般為0。

eg:

int shmid;

char *shmp=shmat(shmid,0,0);

if(shmp==(char *)(-1))

perror("shmat()\n");

3.使用共用記憶體

在使用共用記憶體是需要注意的是,為防止記憶體存取違規,我們一般與訊號量結合使用。

4.分離共用記憶體:

    當程式不再需要共用內後,我們需要將共用記憶體分離以便對其進行釋放,分離共用記憶體的函數原形如下:

int shmdt(char *shmaddr);


 

5. 釋放共用記憶體

int shmctl(int shmid,int cmd,struct shmid_ds *buf);

 

Linux 處理序間通訊 - 共用記憶體shmget方式

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.