2011-04-27 65 views
3

我在进程之间使用boost :: interprocess :: shared_memory_object。如何测试boost共享内存对象是否被删除?

进程(服务器)创建共享内存对象,其他进程(客户端)打开该共享内存对象。但是,客户端进程如何确定共享内存对象是否被服务器进程删除?

As boost documentation states,当请求删除共享内存时,它将不会被删除,直到所有其他引用取消引用为止。因此,即使服务器进程(试图)删除共享内存对象,该共享内存对象也不会被删除,因此,其他客户端进程无法知道该进程是否被删除。

由于引用缓存,我需要这种删除检测。我的意思是,客户端进程存储对共享内存的引用,并在需要时重用它。但是,当服务器进程删除共享内存并使用相同名称重新创建共享内存时,我只希望我的客户端进程检测到这种重新创建并更新对新创建的共享内存对象的引用。

+0

您可以使用unix ipcs命令监视共享内存使用情况,但它可能无助于您的原因 – Arunmu 2011-04-27 04:50:40

回答

2

您可以在您的共享内存对象中包含一个标志,指示您的服务器进程是否仍在使用它。

在您的服务器进程尝试删除共享内存之前,将此标志设置为false。当客户端进程看到该标志为false时,他们可以关闭对该对象的引用。

此外,我不认为服务器进程将被允许重新创建具有相同名称的共享对象,直到它被删除,因为我确信这些名称必须是唯一的。

+0

在共享内存中添加额外的标志看起来不错。 – 2011-04-28 05:31:25

+0

但是,服务器可以使用相同的名称重新创建共享内存,因为当请求删除并且其他人正在引用它时,它只是将内部对象的名称更改为不与原始名称冲突。在我的Win32实验中,分页文件的名称在删除时被更改为一些随机(?)名称。此外,boost文档声明(并要求)使用相同名称的娱乐在任何情况下都会成功。 – 2011-04-28 05:34:24

3

命令

ipcs -m 

将显示所有现有的共享存储器段。通过shmid你应该能够识别你的细分市场。还有nattch列显示附加到段的进程的数量。