Bogusław Kempny

fork()

×
Autor English
Początek HC-SR04 LCD Kamera fork() sms strfry() GPIO impulsy Klawiatura Brama GPIO PWM SG90 RFID Grafolog RCP Shutdown Temperatura ....











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