系统重启后处理被阻止的命名信号量

时间:2017-04-13 08:32:29

标签: linux semaphore

在Linux Box中,我使用命名信号量来控制对不同进程使用的系统资源的访问。

如果系统意外崩溃,可能会发生信号量已被获取但尚未返回的信号量。鉴于这种情况,我注意到,即使重启后信号量仍然处于锁定状态。

为了克服这种情况,是否可以在系统启动时取消链接信号量,然后再由一个或多个进程再次使用?或者在信号量被释放之前给它一个sem_post()会更好吗?

顺便说一句:

内部存储信号量的位置。我想知道为什么他们能够在系统重启后幸存下来。

1 个答案:

答案 0 :(得分:2)

您的第二个问题(在哪里存储信号量 ......?)在此处得到解答:sem_overview(7)

简而言之,命名的信号量对象存储在虚拟文件系统中。按照设计,它们会一直存在,直到系统关闭或用sem_unlink(3)删除它们为止。

谷歌的一些研究表明,你所看到的问题并不少见。如果系统崩溃,信号量会持续存在,如您所见。

这是一个问题,有些人甚至提出了完全使用信号量的替代方法,例如:How do I recover a semaphore when the process that decremented it to zero crashes?

至于你的第一个问题,我会画一个并行写入文件并让这个过程或系统崩溃(或者写入文件并且内容还没有刷新到磁盘)。那时该文件的状态和完整性是未知的。

将该场景与您的信号量问题进行比较,我认为在系统启动时删除流氓信号量是您最好的选择。