首页 > 作文

C++共享内存删除的陷阱

更新时间:2023-04-04 10:26:57 阅读: 评论:0

文章转自微信公众号:cpp开发前沿

当进程结束使用共享内存区时,要通过函数 shmdt 断开与共享内存区的连接。该函数声明在 sys/shm.h 中,其原型如下:

int shmdt(const void *shmaddr);

参数 sh英雄传奇电视剧maddr 是 shmat 函数的返回值。

进程脱离共享内存区后,数据结构 shmid_ds 中的压岁钱作文 shm_nattch 就会减 1 。但是共享段内存依然存在,只有 shm_attch 为 0 后,即没有任何进程再使用该共享内存区,共享内存区才在内核中被删除。一般来说,当一个进程终止时,它所附难割难舍加的共享内存区都会自动脱离。
我们通过:

int shmctl( int shmid , int cmd , struct shmid_ds *buf );

来删除已经存在的共享内存:

第一个参数,shmid,是由shmget所返回的标记符。第二个参数,cmd,是要执行的动作。他可以有三个值:

命令 描述:

ipc_stat 设置shmid_ds结构中的数据反射与共享内存相关联的值。i我是歌手黄贯中pc_t 如果进程有相应的权限,将与共享内存相关联的值设置为shmid_ds数据结构中所提供的值。ipc_rmid 删除共享内存段。第三个参数,buf,是一个指向包含共享内存模式与权限的结构的指针,删除的时候可以默认为0。

如果共享内存已经与所有访问它的进程断开了连接,则调用ipc_rmid子命令后,系统将立即删除共享内存的标识符,并删除该共享内存区,以及所有相关的数据结构;

如果仍有别的进程与该共享内存保持连接,则调用ipc_rmid子命令后,该共享内存并不会被立即从系统中删除,而是被设置为ipc_private状态,并被标记为”已被删除”(使用ipcs命令状元榜可以看到dest字段);直到已有连接全部断开,该共享内存才会最终从系统中消失。

需要说明的是:一旦通过shmctl对共享内存进行了删除操作,则该共享内存将不能再接受任何新的连接,即使它依然存在于系统中!所以,可以确知, 在对共享内存删除之后不可能再有新的连接,则执行删除操作是安全的;否则,在删除操作之后如仍有新的连接发生,则这些连接都将可能失败!

shmdt和shmctl的区别:

hmdt 是将共享内存从进程空间detach出来,使进程中的shmid无效化,不可以使用。但是保留空间。
shmctl(sid,ipc_rmid,0)则是删除共享内存,彻底不可用,释放空间。

到此这篇关于c++共享内存删除的陷阱的文章就介绍到这了,更多相关共享内存删除的陷阱内容请搜索www.887551.com以前的文章或继续浏览下面的相关文章希望大家以后多多支持www.887551.com!

本文发布于:2023-04-04 10:26:56,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/zuowen/bde8548c342c9adb00835e4bd91447dd.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

本文word下载地址:C++共享内存删除的陷阱.doc

本文 PDF 下载地址:C++共享内存删除的陷阱.pdf

标签:内存   进程   数据结构   命令
相关文章
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图