2015-01-21 4 views
6

In einem Linux-System mit mehreren Prozessen erlauben V-Semaphoren eine Option von SEM_UNDO, die verhindert, dass ein Semaphor "hängenbleibt", wenn ein Prozess mit dem Semaphor abstürzt. Was ist die korrekte Methode, um zu verhindern, dass POSIX-Semaphoren durch einen Absturz in einem Prozess, der den Semaphor hält, blockiert werden? Oder garantiert POSIX , dass der Semaphor im Falle eines Absturzes freigegeben wird?Äquivalent von Sys V SEM_UNDO für Posix-Semaphoren

+1

Ist das beantwortet von http://stackoverflow.com/questions/2053679/how-do-i-recover-a-semaphore-when-the-process-that-decremented-it-to-zero- crashe –

+0

Ja und nein. Ich hatte auf eine autoritative Quelle für POSIX-Semaphore gehofft, die die Dinge infolge eines Absturzes in einem unbestimmten Zustand beließ. Diese Verbindung bietet sicherlich eine Möglichkeit, mit einer solchen Situation umzugehen, ohne jedoch das Warum/Wie zu erklären, was aus der POSIX-Spezifikation ein Versehen zu sein scheint. Ich habe am Ende nur SYS-V-Semaphore verwendet, aber ich bin gespannt, warum POSIX das scheinbar einzig sinnvolle Verhalten eines Mutex bei einem Absturz nicht festlegt. – Joe

+1

Nun: http://charette.no-ip.com:81/programming/2010-01-13_PosixSemaphores/ - auch mit der Dateisperrlösung. –

Antwort

-1

Sie können den Signalhandler für SIGSEGV verwenden und anschließend den Signalhandler entsperren und entfernen.

// set handler 
signal(SIGSEGV, handler); 

void handler(int signum) { 
// unlock the locked semaphores 
signal(SIGSEGV, SIG_DFL); 
} 
+0

Aber es gibt keine Garantie, welcher Thread ein SEGV fängt. Es gibt also keine Garantie, dass Sie in dem Thread sind, der das Schloss besitzt. – Joe

+0

Ich denke, Semaphore haben keine Ahnung von Besitz, Mutexe tun. – Pointer