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

4
类似于:在Linux上删除所有共享内存和信号量,但我希望用C语言实现,而不是使用一些脚本。
我的具体问题:在Linux和Mac中,当我调试一个程序并在进程中途终止时,共享资源(内存+信号量)不会被释放。我的程序做了一些客户端服务器的事情,其中服务器是第一个获取共享资源的进程。因此,在没有分离的情况下终止后,重新启动程序时,它会认为自己是客户端,而没有服务器(因为资源已经被创建而未被释放)。
目前,我正在使用Qt来管理共享资源,但是Qt似乎没有处理这种情况的方法(create返回的错误代码是资源已经被创建)。因此,我在寻找更有针对性的OS实现方式。注意:Windows没有这个问题,因为共享资源会在自动终止时被释放。
1个回答

2

请查看man ipcrm

ipcrm - 删除消息队列、信号量集或共享内存标识符

服务器是否正常终止?如果是,则可以在退出之前调用shmdt()。 如果它崩溃了,那就有点困难了。一件事是让它使用shmctl来查看有多少进程已经连接到shm。如果为0,则显然不是客户端。

还有一个标志可以设置在shm段上IPC_RMID,尽管使用似乎有点模糊。


不,服务器崩溃了。我目前正在查看shmctl,谢谢! - chacham15

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接