2017-04-13 5 views
1

Innerhalb einer Linux Box benutze ich benannte Semaphoren um den Zugriff auf Systemressourcen zu kontrollieren, die von verschiedenen Prozessen benutzt werden.Umgang mit blockierten benannten Semaphoren nach einem Systemneustart

Wenn das System versehentlich abstürzt, kann es vorkommen, dass ein Semaphor erfasst, aber noch nicht zurück gegeben wurde. Angesichts dieser Situation bemerkte ich, dass der Semaphor auch nach einem Neustart immer noch in einem gesperrten Zustand ist.

Um eine solche Situation zu überwinden, wäre es in Ordnung, den Semaphor beim Systemstart zu trennen, bevor er erneut von einem oder mehreren Prozessen verwendet wird? Oder wäre es besser, ihm einen sem_post() zu geben, bis der Semaphor freigegeben wird?

BTW:

Wo Semaphore intern gespeichert sind. Ich frage mich, warum sie Systemneustarts überleben.

Antwort

2

Ihre zweite Frage (Wo Semaphore intern gespeichert werden ...?) Beantwortet hier: sem_overview(7)

Auf den Punkt gebracht, werden die benannten Semaphor Objekte auf einem virtuellen Dateisystem gespeichert. Sie bleiben bis zum Herunterfahren des Systems oder bis sie mit sem_unlink(3) entfernt wurden.

Ein wenig Google-Forschung zeigt, dass das Problem, das Sie sehen, nicht ungewöhnlich ist. Wenn das System abstürzt, bleibt der Semaphor bestehen, wie Sie gesehen haben.

Es ist genug, um ein Problem, dass einige Leute sogar mit Alternativen kommen für Semaphore zusammen, siehe zum Beispiel mit: How do I recover a semaphore when the process that decremented it to zero crashes?

Was Ihre erste Frage, ich habe eine parallel zum Schreiben in eine Datei ziehen würde und die mit Prozess oder Systemabsturz dabei (oder in eine Datei geschrieben wurde und der Inhalt noch nicht auf die Festplatte geschrieben wurde). Der Status und die Integrität dieser Datei sind zu diesem Zeitpunkt unbekannt.

Vergleichen Sie dieses Szenario mit Ihrem Semaphor-Problem, ich glaube, das Löschen der Rogue-Semaphor beim Systemstart ist Ihre beste Wette.