2010-07-29 6 views
7

Pracuję nad programem, który korzysta z pamięci współdzielonej. Wiele instancji wspomnianego programu łączy się z istniejącym lub tworzy go od nowa, a następnie przekazuje systemowi operacyjnemu, gdy nie ma innych procesów lub po prostu się go odłącza i kończy. Myślałem o używaniu prostego licznika do śledzenia, ile procesów go używa.Jak wykonać czyszczenie po SIGKILL?

Używam funkcji atexit() do czyszczenia, jednak, afaik, po odebraniu sygnału SIGKILL, procesy nie wykonają żadnego czyszczenia, więc jeśli któryś z tych procesów nie zakończy się normalnie, być może nigdy nie będę w stanie wyczyść pamięć.

Czy istnieje sposób określenia, co należy zrobić, nawet po sygnale SIGKILL? Prawdopodobnie zamierzam napisać jakiś mechanizm podobny do timera, aby sprawdzić, czy procesy wciąż są żywe, ale naprawdę chciałbym tego uniknąć, jeśli jest inny sposób.

Odpowiedz

16

Nie, SIGKILL nie może zostać złapany w żaden sposób przez Twoją aplikację - jeśli to możliwe, aplikacja może zignorować to, co może zniweczyć jego cel.

13

Nie możesz złapać SIGKILL.

Jednak: możesz można nadal czyścić, pod warunkiem, że czyszczenie odbywa się w innym procesie. Istnieje wiele strategii, które możesz tu zastosować, aby twój proces sprzątania był widoczny, a inne procesy pojawiają się i znikają.

Na przykład: możesz mieć gniazdo domeny Unix w znanym miejscu, które gospodyni słucha; każdy proces slave otwiera gniazdo, aby wskazać, że korzysta z segmentu pamięci dzielonej. Kiedy niewolnik wychodzi, z jakiegokolwiek powodu, gniazdo zostanie zamknięte. Gospodyni może to zobaczyć i może zrobić porządek.

+0

+1 za wyjaśnienie koncepcji – Robert

4

W połączeniu z pamięcią wspólną, odporne muteksy znajdujące się w segmencie pamięci współdzielonej byłyby świetnym narzędziem. Jeśli proces obumrze, przytrzymując blokadę na wytrzymałym muteksie, następny proces, który spróbuje go zablokować, otrzyma numer EOWNERDEAD i może wykonać czyszczenie, które powinien wykonać oryginalny właściciel.