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



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

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

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

顺便说一句:

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

你的第二个问题(信号量存储在内部的什么地方......?)在这里得到回答:sem_overview(7)

简而言之,命名的信号量对象存储在虚拟文件系统上。 根据设计,它们会一直存活到系统关闭或直到它们被sem_unlink(3)删除。

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

这个问题已经足够了,有些人甚至想出了完全使用信号量的替代方案,例如:当将信号量减少到零的过程崩溃时,如何恢复信号量?

至于您的第一个问题,我会与写入文件并在这样做时让进程或系统崩溃(或已写入文件并且内容尚未刷新到磁盘)相提并论。 此时,该文件的状态和完整性未知。

将这种情况与您的信号量问题进行比较,我相信在系统启动时删除流氓信号灯是您最好的选择。

最新更新