linux C中的共享内存正确清理

linux C中的共享内存正确清理,c,shared-memory,C,Shared Memory,我正在Ubuntu 12.04服务器上用C语言开发一套共享内存的应用程序 这是我第一次尝试处理共享内存,所以我不确定所有的陷阱 我的套件以一个创建共享内存段的守护进程和一些使用它的其他应用程序开始 当然,在开发过程中,可以创建段,然后程序在不删除它的情况下崩溃。我可以使用ipcs-m查看它的列表 通常,这不是什么大问题,因为下次我启动“控制”程序时,它只是重用现有的段 但是,段的大小会不时变化,因此程序无法执行shmget()功能 我的问题 在创建和附加段之前,我想首先确定它是否已经存在,然后如

我正在Ubuntu 12.04服务器上用C语言开发一套共享内存的应用程序

这是我第一次尝试处理共享内存,所以我不确定所有的陷阱

我的套件以一个创建共享内存段的守护进程和一些使用它的其他应用程序开始

当然,在开发过程中,可以创建段,然后程序在不删除它的情况下崩溃。我可以使用
ipcs-m
查看它的列表

通常,这不是什么大问题,因为下次我启动“控制”程序时,它只是重用现有的段

但是,段的大小会不时变化,因此程序无法执行
shmget()
功能

我的问题

在创建和附加段之前,我想首先确定它是否已经存在,然后如果需要,取消附加它,然后我想,shmctl(…,ipc_rmd…)

我可以得到一些帮助来确定正确的事件顺序吗

我想我应该使用
shmctl
来查看发生了什么(附件的数量,如果它存在,等等),但我真的不知道

可能还有另一个应用程序仍在使用该段,当然该应用程序必须首先停止,并处理任何其他可能的异常

我在想,在共享内存段中,我可以复制系统时钟,当应用程序检测到共享内存的时钟相差超过几秒钟时,然后分离或做其他事情


谢谢,马克。

为什么选择System V IPC而不是POSIX?我发现POSIX共享内存更易于使用和管理。此外,你在网上有很多例子。我对POSIX方法的理解是,任何共享mem都必须来自创建共享段的父级的某个子级(fork、exec等)。也许我错了,至少我还没有弄清楚如何执行以下操作。我将创建一些其他应用程序,这些应用程序将使用完全独立于创建者的共享部分。