2 28共享記憶體(1)

2021-10-19 23:43:50 字數 1798 閱讀 1979

shmget只是建立或者取得了乙個共享記憶體段,該共享記憶體段和哪個程序都沒有關係,程序還要通過shmat來附上共享記憶體段,得到該共享記憶體段在該程序的虛擬位址空間中的位置指標。然後才可以進行操作。操作結束後,要呼叫shmdt和共享記憶體段進行分離,分離之後,共享記憶體還存在,只是這個程序不能使用,最後乙個使用該共享記憶體段的程序要呼叫shmctl對共享記憶體段進行銷毀。

最後乙個程序呼叫shmctl刪除共享記憶體段之前要呼叫shmdt進行解除關聯嗎?

-功能:建立乙個新的共享記憶體段,或者獲取乙個既有的共享記憶體段的標識

新建立的記憶體段中的資料都會被初始化為0

-引數:

-key:key_t型別是乙個整型,通過這個找到或者建立乙個共享記憶體

一般使用16進製表示,非0值

-size:共享記憶體的大小,分配時會自動向上取到page_size的整數倍

-shm***:屬性

-訪問許可權

-附加屬性:建立或者判斷共享記憶體是不是存在

-建立:ipc_creat

-判斷共享記憶體是否存在:ipc_excl,需要和ipc_creat一起使用

例: ipc_creat | ipc_excl | 0664

-返回值:

失敗:-1 並設定錯誤號

成功:>0 返回共享記憶體的id,後面操作共享記憶體都是通過這個值

#include #include void *shmat(int shmid, const void *shmaddr, int shm***);

-功能:和當前的程序進行關聯

-引數:

-shmid:共享記憶體的標識,由shmget返回值獲取

-shm***:對共享記憶體的操作

-讀:shm_rdonly:必須要有讀許可權

-如果指定讀寫許可權,設定為0即可

-返回值:

-失敗:(void*)-1

#include #include int shmdt(const void *shmaddr);

-功能:解除當前程序和共享記憶體的關聯

-引數:

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

#include #include int shmctl(int shmid, int cmd, struct shmid_ds *buf);

-功能:對共享記憶體進行操作,主要用於刪除共享記憶體。共享記憶體要刪除才會消失,建立共享記憶體的程序被銷毀了對共享記憶體沒有影響

-引數:

-shmid:共享記憶體的id

-cmd:要做的操作

-ipc_stat:獲取共享記憶體的當前的狀態

-ipc_set:設定共享記憶體的狀態

-ipc_rmid:標記共享記憶體被銷毀

-buf:需要設定或者獲取的共享記憶體的屬性資訊

-cmd如果為ipc_stat:buf要儲存資料,是傳出引數

-cmd如果為ipc_set:buf中是要初始化的資料,是傳入引數,設定到核心中

-cmd如果為ipc_rmid:buf沒有用,可以設定成null

記錄 system v ipc(1) 共享記憶體

linux 的system v ipc是程序間通訊的重要工具。使用共享記憶體的基本步驟 1 用ftok產生 key t變數 2 用shmget建立共享記憶體 3 用shmat對映共享記憶體 4 之後是共享記憶體的操作,直接操作對映的變數位址 int shmgat key t key,int size...

IPC通訊 Posix共享記憶體1

共享記憶體區是最快的可用ipc形式。它允許多個不相關的程序去訪問同一部分邏輯記憶體。如果需要在兩個執行中的程序之間傳輸資料,共享記憶體將是一種效率極高的解決方案。一旦這樣的記憶體區對映到共享它的程序的位址空間,這些程序間資料的傳輸就不再涉及核心。這樣就可以減少系統呼叫時間,提高程式效率 共享記憶體是...

Linux程序間通訊 共享記憶體(1)

共享記憶體,主要是實現程序間大量資料的傳輸。所謂共享記憶體,即在記憶體中開闢一段特殊的記憶體空間,多個程序可互斥訪問,該記憶體空間具有自身特有的資料結構。共享記憶體的資料結構如下 struct shmid ds come from usr include linux shm.h obsolete,u...