Bogusław Kempny

fork()

Autor adres
Początek HC-SR04 LCD Kamera fork() sms strfry() GPIO impulsy Klawiatura Brama GPIO PWM SG90 ....











Kolejny eksperymencik. Tym razem proces potomny zakończy działanie natychmiast po wyświetleniu komunikatu:

main (argc, argv)
{
 int m;
 if (! (m = fork()) )
   {
     printf("Jestem procesem potomnym, koncze prace\n");
   }
 else
   {
     printf("Jestem procesem nadrzednym, zrobię sleep na 10 sekund\n"); fflush(0);
     sleep(10);
   }
}

I jakie procesy teraz zobaczymy jak proces nadrzędny robi sleep?

root@mobile3:/home/rcp# ./test_fork 
Jestem procesem nadrzednym, zrobię sleep na 10 sekund
Jestem procesem potomnym, koncze prace
^Z
[1]+  Stopped                 ./test_fork
root@mobile3:/home/rcp# ps ax|grep fork
11534 pts/0    T      0:00 ./test_fork
11535 pts/0    Z      0:00 [test_fork] <defunct>
11538 pts/0    S+     0:00 grep fork

Nadal dwa! A przecież proces potomny dawno skończył swoje działanie!

Zwróćcie uwagę na literkę w 3 kolumnie tego co komenda ps ax wyświetliła.
To stan procesu, T oznacza że proces jest zatrzymany.
To prawda, zatrzymaliśmy go naciskając CTRL Z.
Ale przy drugim procesie, potomnym, którego miało już nie być, mamy literke Z.

To proces "zombie". Zakończył się, ale nadal w systemie istnieje, bo proces nadrzędny może chcieć się dowiedzieć z jakim rezultatem zakończył pracę.

Po zakończeniu pracy procesu nadrzędnego zniknie, jednak nie zawsze możemy sobie na takie oczekiwanie pozwolić.

Proces nadrzędny może działać nawet przez wiele lat, uruchamiając kilkaset procesów potomnych w sekundzie...