在Linux Box中,我使用命名信号量来控制对不同进程使用的系统资源的访问。
如果系统意外崩溃,可能会发生信号量已被获取但尚未返回的信号量。鉴于这种情况,我注意到,即使重启后信号量仍然处于锁定状态。
为了克服这种情况,是否可以在系统启动时取消链接信号量,然后再由一个或多个进程再次使用?或者在信号量被释放之前给它一个sem_post()会更好吗?
顺便说一句:
内部存储信号量的位置。我想知道为什么他们能够在系统重启后幸存下来。
答案 0 :(得分:2)
您的第二个问题(在哪里存储信号量 ......?)在此处得到解答:sem_overview(7)
简而言之,命名的信号量对象存储在虚拟文件系统中。按照设计,它们会一直存在,直到系统关闭或用sem_unlink(3)
删除它们为止。
谷歌的一些研究表明,你所看到的问题并不少见。如果系统崩溃,信号量会持续存在,如您所见。
这是一个问题,有些人甚至提出了完全使用信号量的替代方法,例如:How do I recover a semaphore when the process that decremented it to zero crashes?
至于你的第一个问题,我会画一个并行写入文件并让这个过程或系统崩溃(或者写入文件并且内容还没有刷新到磁盘)。那时该文件的状态和完整性是未知的。
将该场景与您的信号量问题进行比较,我认为在系统启动时删除流氓信号量是您最好的选择。