我需要在共享内存对象上使用 shm_unlink 吗?

2023-12-25

我编写了一个连续运行的服务器(GNU C++ / Linux),偶尔执行小型独立程序来完成工作。为了有效地将数据获取到工作程序,服务器创建并映射一个共享内存对象(为了清楚起见,缩写了代码):

int fd = shm_open("/shm_file", O_CREAT | O_TRUNC | O_RDWR, S_IRUSR | S_IWUSR);
ftruncate(...);
data = mmap(...);
// etc...
launchWorker(...);   // Start the worker program

然后,工作程序以类似的方式打开该共享内存(只​​读除外,没有 O_CREAT 和 O_TRUNC,即我们假设它已经存在)。

当工作程序完成时,它会关闭文件描述符,使用 munmap(...) 取消映射并使用 shm_unlink(...) 取消链接。

此时,有一个文件“/dev/shm/shm_file”,我猜它是共享内存对象。在工作线程中取消链接并不会删除它,因为服务器仍然将其打开。当服务器取消链接时,文件系统对象就会消失。此行为与 shm_open / shm_unlink 的手册页一致,并且适用于我的服务器/工作人员案例。

但是,现在我希望工作人员能够在彼此之间共享某些数据,并且可能(用于测试)在服务器未运行时执行此操作。

如果我在一个工作程序中创建一个共享内存对象,并且在退出时不使用 munmap(...) 和 shm_unlink(...),我注意到共享内存对象保留在 /dev/shm 中,并且我可以打开在另一个工作程序中再次执行此操作。这很方便。

然而,这样做安全吗? (即重复运行映射共享内存的程序,然后不会取消映射/取消链接它)?我猜 unmap() 并不重要,因为内存映射会随着进程而消失,但是 shm_unlink 呢?鉴于操作系统根据对象是否仍在使用来决定何时删除该对象,如果我每次都无法调用 shm_unlink() ,这是否会导致某种泄漏?


唯一的漏洞是,即使在最后一个打开该文件的进程存在之后,该文件仍将保留。

但由于这就是本案的意图,因此它并不是真正的泄漏。

文件在/dev/shm行为就像普通文件一样(因为它们就是)。

这意味着可以删除该名称(使用unlink or shm_unlink)但文件数据将保留,直到名称消失并且使用它的最后一个进程停止这样做(打开文件或其内容mmap:ed 算作使用它)。

但无论您打开和/或映射它多少次,都只有一个文件。

当进程退出时,所有打开的文件描述符都将关闭,并且所有内存映射都将被删除。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

我需要在共享内存对象上使用 shm_unlink 吗? 的相关文章

  • 如何在C++中实现模板类协变?

    是否可以以这样一种方式实现类模板 如果模板参数相关 一个对象可以转换为另一个对象 这是一个展示这个想法的例子 当然它不会编译 struct Base struct Derived Base template
  • 嵌入式系统中的malloc [重复]

    这个问题在这里已经有答案了 我正在使用嵌入式系统 该应用程序在 AT91SAMxxxx 和 cortex m3 lpc17xxx 上运行 我正在研究动态内存分配 因为它会极大地改变应用程序的外观 并给我更多的力量 我认为我唯一真正的路线是为
  • fgets() 和 Ctrl+D,三次才能结束?

    I don t understand why I need press Ctrl D for three times to send the EOF In addition if I press Enter then it only too
  • SSH 主机密钥指纹与模式 C# WinSCP 不匹配

    我尝试通过 WinSCP 使用 C 连接到 FTPS 服务器 但收到此错误 SSH 主机密钥指纹 与模式不匹配 经过大量研究 我相信这与密钥的长度有关 当使用 服务器和协议信息 下的界面进行连接时 我从 WinSCP 获得的密钥是xx xx
  • 为什么 POSIX 允许在只读模式下超出现有文件结尾 (fseek) 进行搜索

    为什么寻找文件结尾很有用 为什么 POSIX 让我们像示例中那样在以只读方式打开的文件中进行查找 c http en cppreference com w c io fseek http en cppreference com w c io
  • 为什么禁止在 constexpr 函数中使用 goto?

    C 14 对你能做什么和不能做什么有规则constexpr功能 其中一些 没有asm 没有静态变量 看起来相当合理 但标准也不允许goto in constexpr功能 即使它允许其他控制流机制 这种区别背后的原因是什么 我以为我们已经过去
  • C# 中值类型和引用类型有什么区别? [复制]

    这个问题在这里已经有答案了 我知道一些差异 值类型存储在堆栈上 而引用类型存储在托管堆上 值类型变量直接包含它们的值 而引用变量仅包含对托管堆上创建的对象位置的引用 我错过了任何其他区别吗 如果是的话 它们是什么 请阅读 堆栈是一个实现细节
  • 使用 hcitool 扫描低功耗蓝牙?

    当我运行此命令时 BLE 设备扫描仅持续 5 秒 sudo timeout 5s hcitool i hci0 lescan 输出显示在终端屏幕中 但是 当我将输出重定向到文件以保存广告设备的地址时 每次运行该命令时 我都会发现该文件是空的
  • .Net Core / 控制台应用程序 / 配置 / XML

    我第一次尝试使用新的 ConfigurationBuilder 和选项模式进入 Net Core 库 这里有很多很好的例子 https docs asp net en latest fundamentals configuration ht
  • 使用向量的 merge_sort 在少于 9 个输入的情况下效果很好

    不知何故 我使用向量实现了合并排序 问题是 它可以在少于 9 个输入的情况下正常工作 但在有 9 个或更多输入的情况下 它会执行一些我不明白的操作 如下所示 Input 5 4 3 2 1 6 5 4 3 2 1 9 8 7 6 5 4 3
  • 使用 LINQ 查找列表中特定类型的第一个元素

    使用 LINQ 和 C 在元素列表中查找特定类型的第一个项目的最短表示法是什么 var first yourCollection OfType
  • 在 MacO 和 Linux 上安装 win32com [重复]

    这个问题在这里已经有答案了 我的问题很简单 我可以安装吗win32com蟒蛇API pywin32特别是 在非 Windows 操作系统上 我一直在Mac上尝试多个版本pip install pywin32 都失败了 下面是一个例子 如果你
  • .NET 选项将视频文件流式传输为网络摄像头图像

    我有兴趣开发一个应用程序 它允许我从 xml 构建视频列表 包含视频标题 持续时间等 并将该列表作为我的网络摄像头流播放 这意味着 如果我要访问 ustream tv 或在实时通讯软件上激活我的网络摄像头 我的视频播放列表将注册为我的活动网
  • C 中的位移位

    如果与有符号整数对应的位模式右移 则 1 vacant bit will be filled by the sign bit 2 vacant bit will be filled by 0 3 The outcome is impleme
  • AccessViolationException 未处理

    我正在尝试使用史蒂夫 桑德森的博客文章 http blog stevensanderson com 2010 01 28 editing a variable length list aspnet mvc 2 style 为了在我的 ASP
  • 什么是 C 语言的高效工作流程? - Makefile + bash脚本

    我正在开发我的第一个项目 该项目将跨越多个 C 文件 对于我的前几个练习程序 我只是在中编写了我的代码main c并使用编译gcc main c o main 当我学习时 这对我有用 现在 我正在独自开展一个更大的项目 我想继续自己进行编译
  • 作为字符串的动态属性名称

    使用 DocumentDB 创建新文档时 我想设置属性名称动态地 目前我设置SomeProperty 像这样 await client CreateDocumentAsync dbs db colls x new SomeProperty
  • 在Linux中使用C/C++获取机器序列号和CPU ID

    在Linux系统中如何获取机器序列号和CPU ID 示例代码受到高度赞赏 Here http lxr linux no linux v2 6 39 arch x86 include asm processor h L173Linux 内核似
  • C++ 成员函数中的“if (!this)”有多糟糕?

    如果我遇到旧代码if this return 在应用程序中 这种风险有多严重 它是一个危险的定时炸弹 需要立即在应用程序范围内进行搜索和销毁工作 还是更像是一种可以悄悄留在原处的代码气味 我不打算writing当然 执行此操作的代码 相反
  • 如何将字符串“07:35”(HH:MM) 转换为 TimeSpan

    我想知道是否有办法将 24 小时时间格式的字符串转换为 TimeSpan 现在我有一种 旧时尚风格 string stringTime 07 35 string values stringTime Split TimeSpan ts new

随机推荐

  • 通用电子邮件验证器

    我想创建一个表单 用户将在其中输入他的电子邮件 我想验证客户端的电子邮件格式 Angular 2 中有通用的电子邮件验证器吗 注意 类似于AngularJS 验证器 https docs angularjs org api ng input
  • marklogic mlcp 自定义转换拆分聚合文档为多个文件

    我有一个 JSON 聚合 文件 我想使用 mlcp 将其拆分并作为多个文档摄取到 MarkLogic 中 我想要使用 javascript 在摄取过程中转换内容 http docs marklogic com guide mlcp impo
  • 同时声明多个变量的更优雅的方式

    要 同时 声明多个变量 我会这样做 a b True False 但如果我必须声明更多的变量 它就会变得越来越不优雅 a b c d e f g h i j True True True True True False True True
  • 如何以编程方式更改 Window 注册表中的值?

    我需要以编程方式将 HKEY CURRENT USER Software Intuit QBWebConnector 中找到的 Level 字符串更改为 Verbose 做这个的最好方式是什么 C bat 文件 我以前从来没有修改过注册表
  • GCM 的注册 ID 重复

    我们有一个使用 GCM 的应用程序 当用户首次打开应用程序时 应用程序会检查共享首选项以查看用户之前是否注册过 如果没有 则从 GCM 获取注册 ID 并将其存储到共享首选项中 还有一个存储用户 ID 和注册 ID 的第 3 方服务器 我阅
  • Javascript URL 深度(级别)

    是否可以使用 Javascript 获取 url 深度 级别 如果我有这个网址 www website com site product category item gt 深度 4 www website com site product
  • Spring Security 中的 beans.NotReadablePropertyException

    我对 Spring Security 非常陌生 我捡起来了this https rads stackoverflow com amzn click com 1847199747书并尝试执行代码 当我这样做时 我得到了 org springf
  • 如何读取 Objective-C 堆栈跟踪

    我有以下堆栈跟踪 0 MyApp 0x000833a3 TFCrashHandler backtrace 26 1 MyApp 0x000836bd TFSignalHandler 28 2 libsystem c dylib 0x33ea
  • 删除重复行并更新引用

    如何删除一个表中的重复行并将另一表中的引用更新为剩余行 重复仅出现在名称中 Id 列是标识列 Example 假设我们有两张表Doubles and Data Doubles table Id int Name varchar 50 Dat
  • 如何从嵌入式 HTML 与 Swift 进行通信以更改 bool

    您好 我想在执行 html 中的 onReady 块后更改绑定变量 click 的值 我可以使用评估java脚本从swift到html进行通信 但是我如何从 html 中的 onReady 与 swift 进行通信以更改 bools val
  • Chrome 扩展中的跨源 XMLHttpRequest

    根据 chrome 扩展 API 如果设置了权限 则应允许使用 XMLHttpRequest 对象进行跨源调用 只要扩展程序首先请求跨源权限 就可以与其源之外的远程服务器进行通信 我正在密切关注谷歌教程 http code google c
  • 如何 dplyr 按列索引重命名列?

    以下代码重命名数据集中的第一列 require dplyr mtcars gt setNames c RenamedColumn names 2 length names 期望的结果 RenamedColumn cyl disp hp dr
  • jsPlumb:如何选择特定连接器

    我似乎不知道如何选择特定的 jsPlumb 连接器 我知道我可以选择与源或目标相关的所有连接器 但通常我会在同一源和目标之间有多个连接器 因此在这种情况下我看不到能够选择特定连接器的方法 我的具体用例如下 如果用户单击连接器 则会出现一个对
  • 无法重新启动 Spring 批处理作业

    我有一个 Spring Batch 作业 用于读取 转换和写入 Oracle 数据库 我通过 CommandLineJobRunner 实用程序运行该作业 使用 fat jar 使用 Maven Shade 插件生成的依赖项 该作业随后由于
  • 有没有办法在 JavaScript 中清除对象?

    有没有办法清除 Javascript 中的对象 具体来说 如果一个对象有多个成员变量 是否有一种简单的方法来重置每个值 function exampleObject this valueA A this valueB B this myAr
  • SQL——在 select 语句中分配位变量

    例如 declare bitHaveRows bit select bitHaveRows count from table where predicate 我可以在这一行调用任何函数吗 select bitHaveRows count 如
  • 如何在请求写入代理 Netty 服务器中的 outboundChannel 时在同一处理程序中获取响应 byteBuf

    我正在实现 netty 代理服务器 如下所示 一个http请求进来 如果本地缓存有数据 则写入channel并flush 如果没有 则从远程服务器获取数据 将其添加到缓存并刷新 我在与写入客户端的处理程序相同的处理程序中从响应中提取 byt
  • 如何查找Javascript语法错误? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我正在编写一段 JavaScript 代码 并在语法中犯了很多愚蠢的错误 但是找到错误所在行的唯一方法是开始注释掉我刚刚编写的代码部分
  • 搜索 R-Studio 中所有打开的文件

    R Studio 中的普通搜索功能 ctrl f 仅搜索当前选定的文件 有没有办法搜索所有打开的文件 Tom 查看以下文档 http www rstudio com ide docs using navigation http www rs
  • 我需要在共享内存对象上使用 shm_unlink 吗?

    我编写了一个连续运行的服务器 GNU C Linux 偶尔执行小型独立程序来完成工作 为了有效地将数据获取到工作程序 服务器创建并映射一个共享内存对象 为了清楚起见 缩写了代码 int fd shm open shm file O CREA