如何测试是否删除了boost共享内存对象?

时间:2011-04-27 04:47:29

标签: c++ boost shared-memory

我在进程之间使用了boost :: interprocess :: shared_memory_object。

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

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

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

2 个答案:

答案 0 :(得分:3)

命令

ipcs -m

将显示所有现有的共享内存段。通过 shmid ,您应该能够识别您的细分。还有 nattch 列显示了该段附加进程的数量。

答案 1 :(得分:2)

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

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

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