返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C++共享内存删除的陷阱
  • 580
分享到

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

2024-04-02 19:04:59 580人浏览 安东尼
摘要

文章转自微信公众号:CPP开发前沿 当进程结束使用共享内存区时,要通过函数 shmdt 断开与共享内存区的连接。该函数声明在 sys/shm.h 中,其原型如下:  int

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

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

int shmdt(const void *shmaddr);

参数 shmaddr 是 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结构中的数据反射与共享内存相关联的值。
  • IPC_SET 如果进程有相应的权限,将与共享内存相关联的值设置为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++共享内存删除的陷阱的文章就介绍到这了,更多相关共享内存删除的陷阱内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: C++共享内存删除的陷阱

本文链接: https://lsjlt.com/news/161724.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • C++共享内存删除的陷阱
    文章转自微信公众号:CPP开发前沿 当进程结束使用共享内存区时,要通过函数 shmdt 断开与共享内存区的连接。该函数声明在 sys/shm.h 中,其原型如下:  int...
    99+
    2024-04-02
  • C++共享内存删除的陷阱是怎样的
    C++共享内存删除的陷阱是怎样的,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。当进程结束使用共享内存区时,要通过函数 shmdt 断开与共享内存区的连接。该函数声明在 sy...
    99+
    2023-06-26
  • linux怎么删除共享内存
    在Linux系统中,可以使用ipcs命令查看当前共享内存的情况。然后可以使用ipcrm命令删除共享内存。1. 使用ipcs命令查看共...
    99+
    2023-08-20
    linux
  • c++ windows下创建共享内存
    在Windows下,可以使用CreateFileMapping函数来创建共享内存。以下是一个示例代码:```cpp#include ...
    99+
    2023-08-19
    windows
  • c++怎么创建共享内存
    在C++中,可以使用操作系统的系统调用或者第三方库来创建共享内存。1. 使用操作系统的系统调用:在Unix/Linux操作系统中,可...
    99+
    2023-08-20
    c++
  • JavaScript 内存管理中的陷阱和技巧
    全局作用域污染:在全局作用域声明变量或函数会导致名称冲突和意外行为,因为全局作用域中的任何代码都可以访问这些变量和函数。 内存泄漏:当 JavaScript 对象不再被任何变量引用时,它们会保留在内存中,这可能会导致内存泄漏并随着时间的...
    99+
    2024-04-02
  • C++中怎么实现共享内存
    C++中怎么实现共享内存,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。初次使用C++标准库实现共享内存的管理时,Vector每次分配内存个数不固定,回收也不固定,这样的话,程序...
    99+
    2023-06-17
  • 如何克服 Python 中的内存泄漏陷阱?
    ...
    99+
    2024-04-02
    内存泄漏 垃圾回收 循环引用 线程安全 内存分析
  • 理解 C++ 函数指针的内存管理:避免指针陷阱
    在 c++++ 中使用函数指针时,必须谨慎考虑内存管理以避免陷阱。这些陷阱包括悬浮指针(指向超出其范围的函数)和野指针(从未初始化或设置为 nullptr 的函数指针)。为了避免这些陷阱...
    99+
    2024-04-29
    c++ 函数指针 typedef
  • C++ 函数的内存分配和销毁中的陷阱和最佳实践
    在 c++++ 中,函数分配和销毁内存时需要注意陷阱,包括内存泄漏(持有已不需要的内存指针)和悬空指针(指向已释放内存)。为了防止这些问题,最佳实践包括:使用智能指针(如 std::sh...
    99+
    2024-04-23
    内存分配 内存销毁 c++
  • C/C++返回内部静态成员的陷阱有哪些
    这篇文章主要介绍“C/C++返回内部静态成员的陷阱有哪些”,在日常操作中,相信很多人在C/C++返回内部静态成员的陷阱有哪些问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C/C++返回内部静态成员的陷阱有哪些...
    99+
    2023-06-17
  • 怎么删除xp系统本地保存的共享密码
    这篇文章主要介绍“怎么删除xp系统本地保存的共享密码”,在日常操作中,相信很多人在怎么删除xp系统本地保存的共享密码问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么删除xp系统本地保存的共享密码”的疑惑有所...
    99+
    2023-06-14
  • c# 通过内存映射实现文件共享内存的示例代码
    目录App1代码:App2代码:App3代码:内存映射文件是利用虚拟内存把文件映射到进程的地址空间中去,在此之后进程操作文件,就像操作进程空间里的地址一样了,比如使用c语言的 mem...
    99+
    2024-04-02
  • nginx共享内存的机制详解
    目录1 共享内存申请2 共享内存实现原理2.1 共享内存组织2.2 slab共享内存管理机制2.3 slab与ngx_shm_zone_t 关系3 共享内存应用1 共享内存申请 共享...
    99+
    2024-04-02
  • 操作系统内存分配与释放的陷阱与技巧
    内存分配 内存释放 内存管理 操作系统 性能优化 陷阱:内存泄漏 内存泄漏是指不再被应用程序访问的内存块被分配后从未被释放。这会导致内存耗尽,最终导致系统崩溃。避免内存泄漏的最重要技巧是始终使用受支持的内存管理功能,例如引用计数或垃圾...
    99+
    2024-02-17
    操作系统内存分配与释放是一个复杂的过程 其中隐藏着许多陷阱和技巧。本文探讨了这些陷阱和技巧 并提供了一些优化内存管理的最佳实践。
  • php共享内存的方法是什么
    在PHP中,可以使用共享内存来实现进程间的通信和数据共享。PHP提供了一个扩展模块,名为shmop,该模块允许我们创建和操作共享内存...
    99+
    2023-09-06
    php
  • 怎么在c#中通过内存映射共享文件
    本篇文章给大家分享的是有关怎么在c#中通过内存映射共享文件,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。App1代码:using System;using ...
    99+
    2023-06-14
  • C#.Net通信共享内存映射文件是什么
    这篇文章主要讲解了“C#.Net通信共享内存映射文件是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C#.Net通信共享内存映射文件是什么”吧!节点通信存在两种模型:共享内存(Share...
    99+
    2023-06-30
  • win10 gpu共享内存和专有内存的区别是什么
    这篇“win10 gpu共享内存和专有内存的区别是什么”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“win10 gpu共享内...
    99+
    2023-07-01
  • Linux共享内存实现机制的详解
    Linux共享内存实现机制的详解 内存共享: 两个不同进程A、B共享内存的意思是,同一块物理内存被映射到进程A、B各自的进程地址空间。进程A可以即时看到进程B对共享内存中数据的更新,反之亦然。由于多个进程共...
    99+
    2022-06-04
    详解 机制 内存
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作