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
English