如何删除未使用的共享内存和信号量?

类似于:
Delete all shared memory and semaphores on Linux然而,我想在C中这样做,而不是用一些脚本.

我的具体问题:在linux mac中,当我调试程序并在进程中终止时,共享资源(内存信号量)不会被释放.我的程序执行一些客户端服务器,其中服务器是获取共享资源的第一个进程.因此,在没有分离的终止之后,当我重新启动程序时,它假定它是没有服务器的客户端(因为资源已经创建并且没有被释放).

目前,我使用Qt来管理共享资源,但Qt似乎没有办法处理这种情况(创建返回的错误代码是资源已经创建).因此,我希望以更具操作系统的方式来实现这一目标.注意:Windows没有此问题,因为共享资源在终止时自动释放.

最佳答案 检查man ipcrm.

ipcrm – remove a message queue, semaphore set or shared memory id

服务器是否正常终止?如果是这样,你可以让它在退出前调用shmdt().
如果它崩溃了,那就更难了.有一点是让它使用shmctl
看看有多少进程附加了shm.如果是0,那么你显然不是客户.

还有一个可以在shm段IPC_RMID上设置的标志,尽管用法看起来有些模棱两可.

点赞