程序間通訊 共享記憶體

2021-09-10 06:34:07 字數 1521 閱讀 6192

共享記憶體

共享記憶體區是最快的ipc形式,一旦這樣的記憶體對映到共享它的程序位址空間,這些程序間資料傳遞不再涉及核心,也就是說程序不再通過執行進入核心的系統呼叫來傳遞彼此的資料。

共享記憶體的優點:

共享記憶體是程序間通訊最快的,可以減少拷貝次數。共享記憶體不提供任何互斥和同步機制,必須由使用者自己完成。

注意:共享記憶體的建立是以頁為單位的

systemv ipc(共享記憶體)資源的生命週期隨核心

共享記憶體函式:

shmget函式

功能:建立共享記憶體

原型: int shmget(key_t key, size_t size, int shm***);

引數: key:該共享記憶體段的名字(標識記憶體段,類似於檔案識別符號inode)

size:共享記憶體大小

shmget:由九個許可權標誌構成,它們的用法和建立檔案時使用的mode模式標誌是一樣的

返回值:成功返回非負整數,即該共享記憶體段的標識碼;失敗返回-1。

shmat函式

原型:void *shmat(int shmid, const void *shmaddr, int shm***);

引數: shmid:共享記憶體標識

shmaddr:指定連線的位址

shm***:它的兩個可能取值是shm_rnd和shm_rdonly

返回值:成功返回乙個指標,指向共享記憶體第乙個節;失敗返回-1

說明:shmdt函式

功能:將共享記憶體段與當前程序脫離

原型:

int shmdt(const void *shmaddr);

引數 shmaddr:由shmat所返回的指標

返回值:成功返回0;失敗返回-1

將共享記憶體與當前程序脫離不等於刪除共享記憶體段

刪除共享記憶體段分兩步:

1.去關聯

2.刪除(即釋放記憶體空間)

shmctl函式

功能:用於控制共享記憶體

原型: int shmctl(int shmid, int cmd, struct shmid_ds *buf);

引數: shmid:由shmget返回的共享記憶體標識碼

cmd:將要採取的措施(三個可取值 ipc_stat,ipc_set, ipc_rmid)

buf:指向乙個儲存著共享記憶體的模式狀態和訪問許可權的資料結構

返回值:成功返回0;失敗返回-1;

引數說明:

ipc_stat:把shmid_ds結構中的資料設定為共享記憶體的關聯值

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

ipc_rmid:刪除共享記憶體段

程序間通訊 共享記憶體

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

程序間通訊 共享記憶體

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

程序間通訊 共享記憶體

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