首页 > 代码库 > linux 共享内存 shmat,shmget,shmdt,shmctl
linux 共享内存 shmat,shmget,shmdt,shmctl
shmget
int shmget(key_t key, size_t size, int flag);//开辟一段共享内存
key_t key :标识符的规则()
size_t size :共享内存的大小
int flag :读写的权限
返回值:成功返回一个贡献内存的id,失败返回 -1;
当key的取值为IPC_PRIVATE,则函数shmget()将创建一块新的共享内存;如果key的取值为0,而参数shmflg中设置了IPC_PRIVATE这个标志,则同样将创建一块新的共享内存。
size 要创建的贡献内存的长度,以页为最小到分配单元,PACE_SIZE=4096字节,即size = 1 时实际开辟的大小为4K
flag:
IPC_CREAT 如果共享内存不存在,则创建一个共享内存,否则打开操作。
IPC_EXCL 只有在共享内存不存在的时候,新的共享内存才建立,否则就产生错误。
shmat
void *shmat(int shmid, const void *addr, int flag);//得到共享内存存储段的地址
int shmid :shmget()返回的存储段的id
void* addr:一般为0,表示连接到由内核选择的第一个可用地址上,否则,如果flag没有指定SHM_RND,则连接到addr所指定的地址上,如果flag为SHM_RND,则地址取整
int flag:一般为0
返回值:成功返回一个共性内存的存储段的地址。失败返回 -1
shmdt
int shmdt(void *addr);
addr:共享存储段的地址,以前调用shmat时的返回值
shmdt将使相关shmid_ds结构中的shm_nattch计数器值减1
当一个进程不再需要共享内存段时,它将调用shmdt()系统调用取消这个段,但是,这并不是从内核真正地删除这个段,而是把相关shmid_ds结构的 shm_nattch域的值减1,当这个值为0时,内核才从物理上删除这个共享段
shmctl
int shmctl(int shmid,int cmd,struct shmid_ds *buf)
shmid:共享存储段的id
cmd:一些命令
IPC_STAT 得到共享内存的状态
IPC_SET 改变共享内存的状态
IPC_RMID 删除共享内存
IPC_RMID 命令实际上不从内核删除一个段,而是仅仅把这个段标记为删除,实际的删除发生在最后一个进程离开这个共享段时。
注意,共享内存不会随着程序结束而自动消除,要么调用shmctl删除,
要么自己用手敲命令去删除,否则永远留在系统中。
linux 共享内存 shmat,shmget,shmdt,shmctl