程序間通訊 共享記憶體

2021-10-20 19:54:09 字數 2911 閱讀 9361

共享記憶體就把一片邏輯記憶體共享出來,讓不同的程序去訪問它,修改它。

建立一塊共享記憶體,將這塊共享記憶體對映的自己的虛擬位址空間,接下操作都是直接對這塊虛擬位址進行操作,程序間資料傳遞不再涉及到核心(程序不再通過執行進入核心的系統呼叫來傳遞彼此的資料),所以相較於其他的程序間通訊少了兩步核心態使用者態之間的資料拷貝。

共享記憶體並未提供同步機制。也就是說,在第乙個程序結束對共享記憶體的寫操作之前,並無自動機制可以阻止第二個程序開始對它進行讀取。所以我們通常採用signal訊號來監督乙個程序是否結束,從而確定下乙個程序是否能夠開始。

在linux中,每個程序都有屬於自己的程序控制塊(pcb)和位址空間(addr space),並且都有乙個與之對應的頁表,負責將程序的虛擬位址與實體地址進行對映,通過記憶體管理單元(mmu)進行管理。兩個不同的虛擬位址通過頁表對映到物理空間的同一區域,它們所指向的這塊區域即共享記憶體。

ipcs -m

ipcrm -m [shmid]

int

shmget

(key_t key, size_t size,

int shm***)

;//成功返回乙個非負整數,即該共享記憶體段的標識碼;失敗返回-1

void

*shmat

(int shm_id,

const

void

*shm_addr,

int shm***)

;//如果呼叫成功, 返回乙個指向共享記憶體第乙個位元組的指標;

//如果失敗,返回-1.

將共享記憶體從當前程序中分離。

int

shmdt

(const

void

*shm_addr)

;//成功時,返回0,

//失敗時,返回-1.

注意:

共享記憶體分離並未刪除它,

只是使得該共享記憶體對當前程序不再可用。

刪除共享記憶體物件

int

shmctl

(int shm_id,

int cmd,

struct shmid_ds *buf)

;成功時,返回0,

失敗時,返回-

1.

share_server.c

#include

#include

#include

#include

#include

#include

struct mybuf

;void

myfun

(int signum)

intmain()

shmid =

shmget

(key,

128, ipc_creat|

0777);

if(shmid <0)

printf

("create share memory ok, shmid = %d\n"

, shmid)

;signal

(sigusr2, myfun)

; p =

(struct mybuf*

)shmat

(shmid,

null,0

);if(p ==

null

) p -> pid =

getpid()

;pause()

; pid = p -> pid;

//讀取到了客戶端的pid

while(1

)shmdt

(p);

shmctl

(shmid, ipc_rmid,

null);

system

("ipcs -m");

return0;

}

share_client.c

#include

#include

#include

#include

#include

#include

struct mybuf

;void

myfun

(int signum)

intmain()

shmid =

shmget

(key,

128, ipc_creat|

0777);

if(shmid <0)

printf

("create share memory ok, shmid = %d\n"

, shmid)

;signal

(sigusr1, myfun)

; p =

(struct mybuf*

)shmat

(shmid,

null,0

);if(p ==

null

) pid = p -> pid;

//讀取到伺服器的pid

p -> pid =

getpid()

;kill

(pid, sigusr2)

;while(1

)shmdt

(p);

shmctl

(shmid, ipc_rmid,

null);

system

("ipcs -m");

return0;

}

以上是共享記憶體的通訊的**實現,由伺服器向客戶端的單向通訊,運用到了訊號的有關知識,乙個kill對應乙個pause,只有kill傳達相應的訊號,才能使客戶端(伺服器)的pause()繼續執行下面的語句。

如有疑問,歡迎提問指出。

程序間通訊 共享記憶體

下面是自己寫的乙個簡單的共享記憶體的程序間通訊的例子。共享記憶體是用於程序間大量資料共享的一種方法。include include include include include include int main if buf1 shmat shmid,0,0 void 1 strcpy buf1,...

程序間通訊 共享記憶體

共享記憶體是被多個程序共享的一部分物理記憶體。共享記憶體是程序間共享資料的一種最快的方式,乙個程序向共享記憶體區域寫入資料,共享這個記憶體區域的所有程序就可以立刻看到其中的內容。共享記憶體實現分兩個步驟 建立共享記憶體,使用shmget函式 對映共享記憶體,使用shmat函式 共享記憶體是一種最為高...

程序間通訊 共享記憶體

共享記憶體允許兩個或更多程序共享一塊給定的儲存區,因為資料不需要在不同程序之間訪問,這是最快的一種ipc 傳輸資訊量很大,通過記憶體空間對映程序空間實現,若伺服器程序正在將資料放入共享儲存區,則在它做完這一操作之前,客戶程序不應取這些資料,通常訊號量用來實現對共享儲存訪問的同步。核心為每個共享儲存段...