【发布时间】:2018-11-13 17:15:07
【问题描述】:
我遇到了一个问题,即进程异常终止,因此一些共享资源 (BaseNamedObjects) 未被进程释放。
CreateFileMapping函数返回ERROR_ALREADY_EXISTS表示共享内存已经存在。
在通过 CreateFileMapping 获得 ERROR_ALREADY_EXISTS 后返回一个句柄。
所以我有以下与上述情况相关的查询:
- 我们可以使用这个返回的句柄执行清理吗?
- 我们可以使用 CreateFileMapping 的句柄返回吗?
- 如何清理这样的共享内存对象?
【问题讨论】:
-
您的诊断似乎不正确。如果所有打开该对象句柄的进程都已终止,那么系统将已经清理它。因此,必须仍然存在一个现有进程,该进程具有该对象的句柄。
-
如果您不使用
OBJ_PERMANENT创建对象(为此需要使用本机 api 并具有特殊权限 - 所以可以假设不是) - 当对象的所有句柄关闭时,对象将被自动销毁(名称将被删除)和参考发布(参考可以来自部分映射)。不需要做特别的清理。如果您收到ERROR_ALREADY_EXISTS,则并非所有具有此句柄的进程都已终止 -
您可能只是为您的文件映射对象使用了一个通用名称,而其他人也这样做了。但是如果没有看到minimal reproducible example,我们应该怎么知道呢?
-
你给共享内存区域命名了吗?如果是这样,您应该可以在Process Explorer 中搜索它(并查看哪些应用程序正在使用它)。
标签: c windows winapi shared-memory resource-cleanup