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...