linuxC多程序通訊systemv 共享記憶體

2021-09-26 10:06:57 字數 2453 閱讀 7295

共享記憶體通訊限制

舉例•獲取共享記憶體物件的id: int shmget(key_t key, size_t size, int shm***);

•對映共享記憶體: void *shmat(int shmid, const void *shmaddr, int shm***);

•解除記憶體對映: int shmdt(const void *shmaddr);

•設定記憶體物件: int shmctl(int shmid, int cmd, struct shmid_ds *buf);

•檢視ipc物件資訊:$ ipcs -m

shmget

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

•函式功能:建立或開啟乙個共享記憶體物件

•所需標頭檔案:sys/types.h sys/shm.h

•函式引數

–key:ipc物件的鍵值,一般為ipc_private或ftok返回的key值

–size:共享記憶體大小,一般為記憶體物理頁的整數倍

–shm***:

»ipc_creat:如果不存在與指定的key對應的段,那麼就建立乙個新段

»ipc_excl:若key指定的記憶體存在且指定了ipc_creat,返回eexist錯誤

»shm_hugetlb:使用巨頁(huge page)

•返回值:共享記憶體的識別符號id

shmat

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

•函式功能:將shmid標識的共享記憶體引入到當前程序的虛擬位址空間

•所需標頭檔案:sys/shm.h

•函式引數

–shmid :共享記憶體的ipc物件 id

–shmaddr

»若為null:共享記憶體會被attach到乙個合適的虛擬位址空間,建議使用null

»不為null:系統會根據引數及位址邊界對齊等分配乙個合適的位址

–shm***:

»ipc_rdonly:附加唯讀許可權,不指定的話預設是讀寫許可權

»ipc_remap:替換位於shmaddr處的任意既有對映:共享記憶體段或記憶體對映

»shm_rnd:將shmaddr四捨五入為shmmlba位元組的倍數

•返回值:共享記憶體段的位址

shmdt

•函式原型:int shmdt(const void *shmaddr);

•函式功能:解除記憶體對映,將共享記憶體分離出當前程序的位址空間

•所需標頭檔案:sys/shm.h

•函式引數

–shmaddr:共享記憶體位址

•tips:

–通過fork建立的子程序會繼承父程序所附加的共享記憶體段,父子程序可以通過共享記憶體進行ipc通訊。在exec系統呼叫中,所有附加的共享記憶體段都會被分離

–函式shmdt僅僅是使程序和共享記憶體脫離關係,將共享記憶體的引用計數減1,並未刪除共享記憶體。

–當共享記憶體的引用計數為0時,呼叫shmctl的ipc_rmid命令才會刪除共享記憶體

shmctl

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

•函式功能:獲取/設定 共享記憶體物件屬性

•所需標頭檔案:sys/shm.h

•函式引數

–shmid::共享記憶體的物件id

–cmd:

»ipc_rmid:刪除共享記憶體段及關聯的shmid_ds資料結構

»ipc_stat:將該記憶體物件關聯的shmid_ds資料結構拷貝到引數buf中

»ipc_set:使用buf中的資料更新與該共享記憶體物件相關聯的shmid_ds

»shm_info:獲取系統共享記憶體的相關資訊

»shm_lock:將乙個共享記憶體段鎖進記憶體,防止被swap出去

»shm_unlock:將乙個共享記憶體段解鎖

•shmmni:系統所能建立的共享記憶體的最大個數:ipcmni 32768

•shmmin:乙個共享記憶體段的最小位元組數 4096

•shmmax:乙個共享記憶體段的最大位元組數 33554432

•shmall:系統中共享記憶體的分頁總數 2097152

•shmseg:乙個程序允許attach的共享記憶體段的最大個數

寫共享記憶體

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

讀共享記憶體
#include #include #include #include #include #include #include #include #include int main (int argc, char *ar**)

linuxC多程序通訊 POSIX共享記憶體

簡單的共享記憶體讀寫示例 訊號量和共享記憶體 使用示例 函式功能 改變檔案大小 相關函式 open truncate 表頭檔案 include 函式原型 int ftruncate int fd,off t length 函式說明 ftruncate 會將引數fd指定的檔案大小改為引數length指...

linuxC多程序通訊 檔案鎖

英文名 file lock,在同一時刻只允許乙個程序對檔案進行訪問 建議性鎖 advisory locking,又稱協同鎖 核心只提供加減鎖以及檢測是否加鎖,不提供鎖的控制與協調工作 需要多程序相互檢測確認的加鎖機制 a程序對乙個操作的檔案加了鎖 b程序同樣可以對該檔案進行讀寫操作 只有當b程序也對...

python多程序通訊

這是看書筆記 python提供了多種程序通訊的方式,比如說queue,pipe,value array等。其中queue主要用來在多個程序之間實現通訊。pipe常用來在兩個程序之間實現通訊。queue是多程序安全佇列,queue通過put和get方法來實現多程序之間的資料傳遞。put方法用於將資料插...