共享記憶體通訊限制
舉例•獲取共享記憶體物件的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方法用於將資料插...