13 程序間通訊

2021-12-30 05:47:07 字數 2506 閱讀 2014

一、什麼是共享記憶體

顧名思義,共享記憶體就是允許兩個不相關的程序訪問同乙個邏輯記憶體。共享記憶體是在兩個正在執行的程序之間共享和傳遞資料的一種非常有效的方式。不同程序之間共享的記憶體通常安排為同一段物理記憶體。程序可以將同一段共享記憶體連線到它們自己的位址空間中,所有程序都可以訪問共享記憶體中的位址,就好像它們是由用c語言函式malloc分配的記憶體一樣。而如果某個程序向共享記憶體寫入資料,所做的改動將立即影響到可以訪問同一段共享記憶體的任何其他程序。

特別提醒:共享記憶體並未提供同步機制,也就是說,在第乙個程序結束對共享記憶體的寫操作之前,並無自動機制可以阻止第二個程序開始對它進行讀取。所以我們通常需要用其他的機制來同步對共享記憶體的訪問,例如前面說到的訊號量。

二、共享記憶體的使得

與訊號量一樣,在linux中也提供了一組函式介面用於使用共享記憶體,而且使用共享共存的介面還與訊號量的非常相似,而且比使用訊號量的介面來得簡單。它們宣告在標頭檔案 sys/shm.h中。

1、shmget函式(建立共享記憶體)

該函式用來建立共享記憶體,它的原型為:

intshmget(key_tkey,size_tsize,intshm***);

第乙個引數,與訊號量的semget函式一樣,程式需要提供乙個引數key(非0整數),它有效地為共享記憶體段命名,shmget函式成功時返回乙個與key相關的共享記憶體識別符號(非負整數),用於後續的共享記憶體函式。呼叫失敗返回-1.

不相關的程序可以通過該函式的返回值訪問同一共享記憶體,它代表程式可能要使用的某個資源,程式對所有共享記憶體的訪問都是間接的,程式先通過呼叫shmget函式並提供乙個鍵,再由系統生成乙個相應的共享記憶體識別符號(shmget函式的返回值),只有shmget函式才直接使用訊號量鍵,所有其他的訊號量函式使用由semget函式返回的訊號量識別符號。

第二個引數,size以位元組為單位指定需要共享的記憶體容量

第三個引數,shm***是許可權標誌,它的作用與open函式的mode引數一樣,如果要想在key標識的共享記憶體不存在時,建立它的話,可以與ipc_creat做或操作。共享記憶體的許可權標誌與檔案的讀寫許可權一樣,舉例來說,0644,它表示允許乙個程序建立的共享記憶體被記憶體建立者所擁有的程序向共享記憶體讀取和寫入資料,同時其他使用者建立的程序只能讀取共享記憶體。

2、shmat函式(對映共享記憶體)

第一次建立完共享記憶體時,它還不能被任何程序訪問,shmat函式的作用就是用來啟動對該共享記憶體的訪問,並把共享記憶體連線到當前程序的位址空間。它的原型如下:

void*shmat(intshm_id,constvoid*shm_addr,intshm***);

第乙個引數,shm_id是由shmget函式返回的共享記憶體標識。

第二個引數,shm_addr指定共享記憶體連線到當前程序中的位址位置,通常為空,表示讓系統來選擇共享記憶體的位址。

第三個引數,shm_***是一組標誌位,通常為0。

呼叫成功時返回乙個指向共享記憶體第乙個位元組的指標,如果呼叫失敗返回-1.

3、shmdt函式(分離共享記憶體,沒刪除)

該函式用於將共享記憶體從當前程序中分離。注意,將共享記憶體分離並不是刪除它,只是使該共享記憶體對當前程序不再可用。它的原型如下:

intshmdt(constvoid*shmaddr);

引數shmaddr是shmat函式返回的位址指標,呼叫成功時返回0,失敗時返回-1.

4、shmctl函式(刪除共享記憶體)

與訊號量的semctl函式一樣,用來控制共享記憶體,它的原型如下:

intshmctl(intshm_id,intcommand,structshmid_ds*buf);

第乙個引數,(選擇要操作的共享記憶體識別符號)shm_id是shmget函式返回的共享記憶體識別符號。

第二個引數,(對第乙個引數選擇的共享記憶體進行操作)command是要採取的操作,它可以取下面的三個值 :

ipc_stat:把shmid_ds結構中的資料設定為共享記憶體的當前關聯值,即用共享記憶體的當前關聯值覆蓋shmid_ds的值。

ipc_set:如果程序有足夠的許可權,就把共享記憶體的當前關聯值設定為shmid_ds結構中給出的值

ipc_rmid:刪除共享記憶體段

第三個引數,(獲取linux中描述共享記憶體的shmid_ds結構的相關引數)buf是乙個結構指標,它指向共享記憶體模式和訪問許可權的結構。

shmid_ds結構至少包括以下成員:

structshmid_ds

uid_tshm_perm.uid;

uid_tshm_perm.gid;

mode_tshm_perm.mode;

}; 5**、:

寫:

讀:

Linux程序間通訊1 3

linux程序間通訊的目的 1.資料傳輸 乙個程序需要將它的資料傳送給另乙個程序 2.資源共享 多個程序之間共享同樣的資源 3.通知事件 乙個程序需要向另乙個或一組程序傳送訊息,通知它們發生了某種事件 4.程序控制 有些程序希望完全控制另乙個程序的執行 如debug 程序 此時控制程序希望能夠攔截另...

多工13 程序間通訊 Queue

process之間有時需要通訊,作業系統提供了很多機制來實現程序間的通訊。可以使用multiprocessing模組的queue實現多程序之間的資料傳遞,queue本身是乙個訊息列隊程式,首先用乙個小例項來演示一下queue的工作原理 coding utf 8 from multiprocessin...

php程序間通訊 yoc PHP程序間通訊

php是用c編寫的,因此它對系統底層api的操作與c很像,同大多數語言一樣,php程序間通訊的方式有以下幾種 訊息佇列,管道,共享記憶體,socket和訊號。本文是對這幾種通訊方式對整理 管道通訊pipe 管道用於承載簡稱之間的通訊資料。為了方便理解,可以將管道比作檔案,程序a將資料寫到管道p中,然...