W systemie Linux z wieloma procesami system semaforów V pozwala na opcję SEM_UNDO zapobiegającą "utknięciu" semafora, jeśli proces zatrzymujący semafor się zawiesi. Jaka jest właściwa metoda zapobiegania zakleszczeniu się semaforów POSIX w wyniku awarii w procesie trzymającym semafor? Czy też POSIX gwarantuje, że semafor zostanie zwolniony w przypadku awarii?Równoważnik Sys V SEM_UNDO dla semaforów posix
6
A
Odpowiedz
-1
Możesz użyć programu obsługi sygnału dla SIGSEGV, a następnie odblokować i usunąć obsługę sygnału.
// set handler
signal(SIGSEGV, handler);
void handler(int signum) {
// unlock the locked semaphores
signal(SIGSEGV, SIG_DFL);
}
Czy to odpowiedział http://stackoverflow.com/questions/2053679/how-do-i-recover-a-semaphore-when-the-process-that-decremented-it-to-zero- crashe –
Tak i nie. Miałem nadzieję na pewne wiarygodne źródło semaforów POSIX, pozostawiając rzeczy w nieokreślonym stanie w wyniku awarii. To łącze z pewnością oferuje sposób radzenia sobie z taką sytuacją, ale bez wyjaśnienia, dlaczego/jak wygląda nadzór ze specyfikacji POSIX. Właśnie użyłem semaforów SYS V na końcu, ale jestem ciekawy, dlaczego POSIX nie nakazuje czegoś, co wydaje się jedynym sensownym zachowaniem muteksa podczas awarii. – Joe
Cóż: http://charette.no-ip.com:81/programming/2010-01-13_PosixSemaphores/ - również przy użyciu rozwiązania blokowania plików. –