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

时间:2013-12-20 23:18:31

标签: c linux shared-memory

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

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

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

1 个答案:

答案 0 :(得分:2)

检查man ipcrm

  

ipcrm - 删除消息队列,信号量集或共享内存ID

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

你可以在shm段IPC_RMID上设置一个标志,虽然用法看起来有些含糊不清。