程序間通訊 共享記憶體

2021-10-06 10:30:22 字數 2294 閱讀 9236

今天開共享記憶體總結:

在linux程序間通訊的方式中,共享記憶體是一種最快的ipc方式。因此,共享記憶體用於實現程序間大量的資料傳輸,共享記憶體的話,會在記憶體中單獨開闢一段記憶體空間,這段記憶體空間有自己特有的資料結構,包括訪問許可權、大小和最近訪問的時間等。

優點:(引用

上圖可知,普通程序通訊複製四次,共享記憶體兩次。

使用標頭檔案:

#include

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

key為程式自己提供,為共享記憶體命名

返回乙個識別符號,失敗返回-1,通過返回值,不同程序可以共享記憶體。***為許可權標誌。

void *shmat(int shmid, void *addr, int flag); 連線共享記憶體與虛擬記憶體,id為get返回值,返回值為位址。

int shmdt(const void *shmaddr); 為分離操作,並不刪除。

例項關鍵步驟:

int shmid; 

shmid =

shmget

((key_t)

1234

,sizeof

(struct shared_use_st)

,0666

| ipc_creat)

;//建立

//判斷是否成功

void

*shared_memory =

(void*)

0; shared_memory =

shmat

(shmid,

(void*)

0,0)

;//獲得記憶體位址

//判斷返回值

struct shared_use_st *shared_stuff;

shared_stuff =

(struct shared use_st *

)shared_memory;

//自定義的結構

while(1

) fgets (buffer, bufsiz,

stdin);

strncpy

(shared_stuff >text, buffer, text_sz)

; shared_stuff-

>written =1;

if(strncmp

(buffer ,」end" ,3)

==0)//同步機制,讀寫}/

讀shmid =

shmget

((key_t)

1234

,sizeof

(struct shared_use_st)

,0666

| ipc_creat)

;void

*shared_memory =

(void*)

0; shared_memory =

shmat

(shmid,

(void*)

0,0)

;printf

(」memory attached at %x\n」, ( long

)shared_memory)

;struct shared_use_st *shared_stuff;

shared_stuff =

(struct shared_use st *

)shared_memory;

shared_stuff-

>written =0;

while

(running)

}}

缺點:

事實上,這個程式是不安全的,當有多個程式同時向共享記憶體中讀寫資料時,問題就會出現。 可能你會認為,可以改變一下written的使用方式來解決問題。 例如,只有當written為0時程序才可以向共享記憶體寫人資料,而只有當written不為0時才能對其進行讀取,同時把written進行加1 操作,讀取完後進行減l 操作,這就有點像檔案鎖中的讀寫鎖的功能。

但實際上這都不是原子操作,所以這種做法是不可行的。 試想當written為0時,如果有兩個程序同時訪問共享記憶體,它們就會發現written為0,於是兩個程序都對其進行寫操作,這種操作顯然不行。 當written的值為1 時,有兩個程序同時對共享記憶體進行讀操作時也是如此,當這兩個程序都讀取完時,written的值就變成了-1。可用訊號量。

程序間通訊 共享記憶體

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

程序間通訊 共享記憶體

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

程序間通訊 共享記憶體

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