今天開共享記憶體總結:
在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 傳輸資訊量很大,通過記憶體空間對映程序空間實現,若伺服器程序正在將資料放入共享儲存區,則在它做完這一操作之前,客戶程序不應取這些資料,通常訊號量用來實現對共享儲存訪問的同步。核心為每個共享儲存段...