类似于:Delete all shared memory and semaphores on Linux但是,我想在C中这样做,而不是使用某些脚本。
我的具体问题:在linux + mac中,当我调试程序并在进程中终止时,共享资源(内存+信号量)不会被释放。我的程序执行一些客户端服务器,其中服务器是获取共享资源的第一个进程。因此,在没有分离的终止之后,当我重新启动程序时,它假定它是没有服务器的客户端(因为资源已经创建并且没有被释放)。
目前,我使用Qt来管理共享资源,但Qt似乎没有办法处理这种情况(创建返回的错误代码是资源已经创建)。因此,我希望以更具操作系统的方式来实现这一目标。注意:Windows没有此问题,因为共享资源在终止时自动释放。
答案 0 :(得分:2)
检查man ipcrm
。
ipcrm - 删除消息队列,信号量集或共享内存ID
服务器是否正常终止?如果是这样,您可以在退出前拨打shmdt()
。
如果它崩溃了,那就更难了。有一点是让它使用shmctl
查看附加了shm
的进程数。如果它是0,那么你显然不是客户。
你可以在shm段IPC_RMID
上设置一个标志,虽然用法看起来有些含糊不清。