Linux下程序通訊 共享記憶體之 shm

2021-09-10 23:12:27 字數 1857 閱讀 5433

程序通訊:程序與程序間的資料交換,稱為程序通訊。程序通訊的方式有:共享記憶體、訊號量、管道、訊息佇列、socket等等。

共享記憶體:核心管理一片物理記憶體,允許不同的程序同時對映,多個程序可以對映同一塊記憶體,被多個程序同時對映的物理記憶體,即共享記憶體。對映物理記憶體叫掛接,用完以後解除對映叫脫接。

優點:共享記憶體是程序通訊最快最有效的。

缺點:不存在同步機制,在第乙個程序結束對共享記憶體的寫操作之前,並無自動機制可以阻止第二個程序開始對它進行讀取,需與其他機制合作來實現同步。

共享記憶體有兩種方式:mmap、shm。

mmap:mmap方式是將檔案與程序位址空間進行對映,對實際物理記憶體影響小。mmap()系統呼叫使得程序之間通過對映同乙個普通檔案實現共享記憶體。普通檔案被對映到程序位址空間後,程序可以向訪問普通記憶體一樣對檔案進行訪問,不必再呼叫read,write等操作。即在磁碟上建立乙個檔案,每個程序位址空間中開闢出一塊空間進行對映。

shm:shm方式是將每個程序的共享記憶體與實際物理儲存器進行對映,對實際物理記憶體影響大。即每個程序最終會對映到同一塊物理記憶體。shm儲存在物理記憶體,這樣讀寫的速度要比磁碟要快,但是儲存量不是特別大。

shm實現步驟:

例子如下:shm_test1.c:寫入資料     shm_test2.c:讀資料

//--------------------------------寫入資料---------------------------------

#include #include #include #include #include #include #include#include int shm_id;

char *buff = null;

void fina_l(int signo)

int main(int argc, char *ar**)

shm_id = shmget(shm_key,20,ipc_creat|ipc_excl|0777); //用key來建立共享記憶體

if(shm_id == -1)

for(i=0;i<3;i++)

return 0;

}//--------------------------------讀資料---------------------------------

#include #include #include #include #include #include #include#include int shm_id;

char *buff = null;

void fina_l(int signo)

int main(int argc, char *ar**)

shm_id = shmget(shm_key,20,0);//用key來建立共享記憶體,0表示shm_key對映不存在,則會報錯

if(shm_id == -1)

for(k=0;k<3;k++)

shmctl(shm_id,ipc_rmid,null); //銷毀共享記憶體

return 0;

}

結果如下:

總結:一般來說mmap方式是將檔案與程序位址空間進行對映,對實際物理記憶體影響小,操作簡單,重啟會儲存作業系統同步的映像和本身的檔案,shm方式是將每個程序的共享記憶體與實際物理儲存器進行對映,對實際物理記憶體影響大,所以一般用mmap會比較好。

Linux下程序間通訊之共享記憶體

共享記憶體是程序間通訊的一種方式,顧名思義,共享記憶體就是兩個或多個程序共享一塊記憶體。共享記憶體是在兩個正在執行的程序之間共享和傳遞資料的一種非常有效的方式。不同程序之間共享的記憶體通常安排為同一段物理記憶體。程序可以將同一段共享記憶體連線到它們自己的位址空間中,所有程序都可以訪問共享記憶體中的位...

Linux程序通訊之共享記憶體

一 建立共享記憶體,使用shmget函式 int shmget key tkey,int size,int shm 返回值 如果成功,返回共享記憶體段識別符號。如果失敗,則返回 1 errno einval 無效的記憶體段大小 eexist 記憶體段已經存在,無法建立 eidrm 記憶體段已經被刪除...

Linux程序通訊之共享記憶體

建立共享記憶體,得到乙個id 函式shmget 使用虛擬位址訪問核心共享記憶體,可以使用任何記憶體函式函式與運算符號 解除安裝虛擬位址 函式shmdt 刪除共享記憶體 函式shctl 修改,獲取共享記憶體的屬性 include include int shmget key t key,size t ...