我们在哪里调用“Shm_unlink()”

Posted

技术标签:

【中文标题】我们在哪里调用“Shm_unlink()”【英文标题】:Where do we call 'Shm_unlink()' 【发布时间】:2020-09-10 17:17:23 【问题描述】:

我一直在研究 linux 中的共享内存。 C++中的1个生产者进程和3个消费者进程。 生产者进程通过 'shm_open()' 调用创建共享内存。

3消费者进程从共享内存中读取数据。

您能否建议我在消费者进程读取所有数据后删除共享内存的最佳解决方案?

我们如何知道进程仍在从共享内存中读取?

【问题讨论】:

您可能希望更详细地描述您的问题以获得更好的建议。生产者和消费者之间有什么样的互动?共享文件包含哪些类型的数据? 【参考方案1】:

一种解决方案是生产者必须提前知道消费者的数量。否则,将无法知道将来何时以及有多少进程想要打开该文件,因此您永远不知道何时可以安全地删除该文件。

生产者在共享文件中存储整数个预期消费者。在使用MAP_SHARED 映射文件后,每个消费者自动递减该整数,当它达到 0 时,可以取消链接文件。

请注意,文件可能在打开后立即被取消。取消链接会从文件系统中删除文件名,文件内容在文件的最后一个用户关闭和/或取消映射之前不会被删除。


或者,有一个 cronjob 来删除早于指定持续时间的文件。

【讨论】:

是否有通知机制指示生产者? @sumith 有man7.org/linux/man-pages/man7/inotify.7.html @sumith 你想通知制作人什么? 生产者创建共享内存并向其写入数据。消费者从共享内存中读取数据。如果生产者在读取期间调用“shm_unlink()”,则消费者进程无法读取数据。生产者不知道有多少进程使用共享内存。我希望生产者只有在消费者全部读取后才删除共享内存。 @sumith 您所描述的问题最好通过生产者写入常规文件来解决。

以上是关于我们在哪里调用“Shm_unlink()”的主要内容,如果未能解决你的问题,请参考以下文章

之前:获取最后插入的 id - mysql 现在:我们应该在哪里调用最后插入的 id?

需要调用一个api来使用retrofit在android mvvm中刷新令牌,在哪里编写逻辑?

gdb 使用啥机制来知道在哪里“完成”函数调用?

如何告诉 CMake(通过 externalNativeBuild 调用)在哪里寻找库?

[C++]共享内存cmake报错undefined reference to symbol ‘shm_unlink@@GLIBC_2.2.5

在 DLL 中哪里调用 LoadLibrary?