Jak sobie z tymi zombie poradzic? To proste, zainteresować się swoim potomkiem.
Po skończeniu pracy procesu potomnego system wysyła do procesu nadrzędnego sygnał SIGCHLD. Wystarczy go obsłużyć.
Kolejna drobna rozbudowa naszego programu:
catch_CHLD(int signal_num) { printf("Obsługuję sygnał %i\n", signal_num); fflush(0); } main (argc, argv) { signal(SIGCHLD, catch_CHLD); int m; if (! (m = fork()) ) { printf("Jestem procesem potomnym, kończę pracę\n"); } else { printf("Jestem procesem nadrzednym, zrobię sleep na 10 sekund\n"); fflush(0); sleep(10); } }
Jeśli nadejdzie sygnał SIGCHLD proces przerwie działanie i wykona kod funkcji catch_CHLD.
Może ona oczywiście zrobić coś pożyteczniejszego niż proste wyświetlenie komunikatu, że dotarł sygnał, jednak już sam fakt, że proces nadrzędny obsłużył SIGCHLD wystarczy, żeby proces potomny zniknął z tablicy procesów systemu, nie będzie już zombie.
Na ekranie zobaczymy:
root@mobile3:/home/rcp# ./test_fork Jestem procesem nadrzednym, zrobię sleep na 10 sekund Jestem procesem potomnym, kończę pracę Obsługuję sygnał 17