共享記憶體是程序間通訊最簡單最快速的方式
訪問共享記憶體區域和訪問程序獨有的記憶體區域一樣快,並不需要通過系統呼叫或者其他需要切入核心的過程來完成。同時也避免了對資料的各種不必要的複製。
使用步驟:
(1)首先要分配一塊共享記憶體,使用shmget函式
函式定義:int shmget(key_t key,size_t size, int shm***);
第乙個引數——由程式提供乙個key,為建立的共享記憶體段命名,shmget()函式成功時返回一 個與key相關的共享記憶體識別符號,若呼叫失敗則返回1。不相關的程序可以通過該函式的返回值訪問 共享記憶體。
第二個引數——size是要建立共享記憶體的長度
第三個引數——shm***是許可權標誌,比如ipc_creat和ipc_excl,它們的功能與open()中的o_creat和o_excl一樣。通常情況下我們會使用0644|ipc_creat來作為shm***的值。
(2)要訪問這個共享記憶體塊的每乙個程序都必須將這個共享記憶體繫結到自己的位址空間中,我們使用shmat函式
函式定義:char *shmat(int sh_mid,char*shm_addr,int flag);
第乙個引數——shmid是由shmget()函式返回的記憶體共享標識。
第二個引數——shmaddr指定共享記憶體連線到當前程序中的位址位置,通常為null,讓系統來安排共享記憶體的位址。
第三個引數——shm***是一組標誌位,通常為0。
返回值——如果成功則返回共享記憶體對映到程序中的位址;如果失敗則返回-1。
(3)通訊完畢後,全部程序都將脫離共享記憶體,使用shmdt函式
函式定義:int shmdt(char *shmaddr);
該函式作用是將共享記憶體從當前程序中分離開來,並不是將它刪除,只是使當前程序對共享記憶體沒有使用的能力。
引數shmaddr是shmat()函式返回的位址指標,呼叫成功返回0;如果失敗返回-1。
(4)最後釋放該記憶體塊,使用shmctl函式
函式定義:int shmctl(int sh_mid,int command,struct shmid_ds *buf);
第乙個引數——shmid是shmget()函式返回的共享識別符號。
第二個引數——command是要採取的操作,例如:
ipc_stat:用共享記憶體的當前關聯值覆蓋shmidds的值。
ipc_set:把共享記憶體的當前關聯值設定為shmidds結構中的給出的值
ipc_rmid:刪除共享記憶體段
第三個引數,buf是乙個結構指標,他指向共享記憶體模式和訪問許可權的結構
#include
#include
#include
#include
#include
typedef
struct
sm;int
main()
smp =
shmat
(shmid,
null,0
);//將返回的位址賦給smp
if(smp==
(void*)
-1)printf
("share memry successful!\n");
pid_t pid =
fork()
;if(pid <0)
else
if(pid ==0)
printf
("receive:%s\n"
,smp->dat);if
(strcmp
(smp->dat,
"exit")==
0)memset
(smp,0,
sizeof
(sm));
}if(shmdt
(smp)==-
1)if(
shmctl
(shmid,ipc_rmid,
null)==
-1)printf
("remove shm successfully\n");
//父程序write
}else
if(pid >0)
}if(shmdt
(smp)==-
1)sleep(3
);}return0;
}
程序間通訊 2 共享記憶體
一 共享記憶體實現程序間通訊的基礎 以32位系統為例,其可定址的最大記憶體為4gib 2 32 這4gib記憶體就是常說的虛擬記憶體。linux核心將這4gib的虛擬記憶體分為兩部分 底部較大的部分用於使用者程序,即使用者空間 user space 頂部專用於核心,即核心空間 kernel spac...
Linux程序間通訊 共享記憶體
共享記憶體是執行在同一臺機器上的程序間通訊最快的方式,因為資料不需要在不同的程序間複製。通常由乙個程序建立一塊共享記憶體區,其餘程序對這塊記憶體區進行讀寫。共享記憶體往往與其它通訊機制,如訊號量結合使用,來達到程序間的同步及互斥。首先要用的函式是shmget,它獲得乙個共享儲存識別符號。i nclu...
Linux程序間共享記憶體通訊
使用共享記憶體基本分四個步驟 獲得共享記憶體 shmget 對映共享記憶體shmat 解除對映shmdt 刪除共享記憶體shmctl 於是自己在網上找來了乙個例子看了下,並且用虛擬機器單獨跑了下共享記憶體的經典例程看了下,才知道了自己的問題出現 了 發現有時候只要自己親自將程式一步一步的去測,才知道...