System V IPC之共享内存
共享內存是一種最為高效的進程間通信方式,進程可以直接讀寫內存, 而不需要任何數據的拷貝
?
共享內存在內核空間創建, 可以被進程映射到用戶空間訪問
?
由于多個進程可同時訪問共享內存 , 因此需要同步和互斥機制配合使用
?
????????????????????????????????????????????????? 共享內存的使用步驟
?
創建/打開共享內存
?
映射共享內存, 即把指定的共享內存映射到進程的地址空間用于訪問
?
讀寫共享內存
?
撤銷共享內存映射
?
刪除共享內存對象
?
?????????????????????????????????????????? 共享內存創建
?
#include<sys/ipc.h>
#include<sys/shm.h>
int shmget(key_t key, int size, int shmflg)
?
成功返回共享內存的id 失敗返回EOF
key 和共享內存關聯得key, IPC_PAIVATE或ftok生成
shmflg 共享內存的標志位 IPC_CREAT|0666
???????????????????????????? 共享內存的映射
?
#include <sys/ipc.h.>
#include <sys/shm.h>
void *shmat(int shmid, const void *shmaddr, int shmflg)
?
成功返回映射后的地址, 失敗返回(void *)-1
shmid 要映射的共享內存id
shmaddr 映射后的地址 NULL表示由系統自動映射
shmflg 標志位 0表示可讀寫 SHM_RDONLY表示只讀
?
?????????????????????????????????????? 共享內存讀寫
?
通過指針訪問共享內存, 指針類型取決于共享內存中存放的數據類型
?
????????????????????????????? 共享內存撤銷映射
?
?
#include <sys/ipc.h>
#include <sys/shm.h>
int shmdt(void *shmaddr);
?
成功返回0 失敗返回EOF
不使用共享內存時 應及時撤銷映射
進程結束時 自動撤銷
?
??????????????????????????????????????? 共享內存控制
?
#include <sys/ipc.h>
#include <sys/shm.h>
int shmctl(int shmid, int cmd, struct shmid_ds *buf)
?
成功返回0 失敗返回EOF
shmid 要操作的共享內存的id
cmd 要執行的操作 IPC_STAT(保存共享內存的屬性) IPC_SET(設置共享內存的屬性)
IPC_RMID(刪除共享內存的屬性, 使用時不需要第三個參數)
buf 保存或設置共享內存屬性的地址
?
?
注意事項
?
每塊共享內存大小有限制
ipcs -l 列舉一些共享內存的信息
cat /proc/sys/kernel/shmmax 可在這個文件中修改這些信息
?
共享內存刪除的時間點
shmctl(shmid, IPC_RMID, NULL) 添加刪除標記(只是標記 不會立馬刪除)
nattach 變成0時 真正被刪除 不為零表示還有進程在使用共享內存
?
?
?
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的System V IPC之共享内存的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 女性不孕不育治疗的费用
- 下一篇: 千古风流一坛醋剧情介绍