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...