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

Handling of blocked named semaphores after a system reboot

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

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

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

顺便说一句:

信号量在内部存储在哪里。我想知道为什么他们在系统重启后仍然存在。

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

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

删除它们

一些 Google 研究表明您遇到的问题并不少见。如果系统崩溃,信号量将如您所见持续存在。

有些人甚至想出了完全使用信号量的替代方案,这已经够麻烦了,例如:How do I recover a semaphore when the process that decremented it to zero crashes?

关于您的第一个问题,我想将其与写入文件并在这样做时进程或系统崩溃(或者已经写入文件但内容尚未刷新到磁盘)进行比较。该文件的状态和完整性此时未知。

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