Kiedy więc polecenie jest uruchamiane z powłoki, fork () dziedziczy proces potomny, a exec () ładuje proces potomny do pamięci i wykonuje.
Nie do końca. fork()
klonuje bieżący proces, tworząc identyczne dziecko. exec()
ładuje nowy program do bieżącego procesu, zastępując istniejący.
Moje qs to:
Jeśli proces potomny zawiera wszystkie atrybuty procesu macierzystego (który jest procesem oryginalnym), to jaka jest potrzeba tego procesu potomnego? Oryginalny proces mógł również zostać załadowany do pamięci.
Jest to konieczne, ponieważ proces nadrzędny nie chce się jeszcze kończyć; chce, aby nowy proces rozpoczął się i zrobił coś w tym samym czasie, co nadal będzie wykonywany.
Czy ta koncepcja rozwidlenia i wykonania ma zastosowanie do wszystkich programów wykonywalnych w systemie UNIX? Podobnie jak w przypadku skryptu powłoki, czy tylko poleceń? Czy dotyczy to również wbudowanych poleceń powłoki?
W przypadku poleceń zewnętrznych powłoka robi fork()
tak, że polecenie działa w nowym procesie. Wbudowane są uruchamiane bezpośrednio przez powłokę. Innym godnym uwagi poleceniem jest exec
przekazanie powłoki exec()
zewnętrznemu programowi bez uprzedniego fork()
wejścia. Oznacza to, że sama powłoka została zastąpiona nowym programem, a więc nie ma już możliwości powrotu do tego programu po wyjściu. Jeśli powiesz, exec true
to /bin/true
zastąpi twoją powłokę i natychmiast wyjdzie, nie pozostawiając nic w twoim terminalu, więc się zamknie.
kiedy używana jest koncepcja kopiowania przy zapisie, jeśli wykonam polecenie / skrypt?
W epoce kamienia łupanego fork()
musiałem skopiować całą pamięć z procesu wywoływania do nowego procesu. Kopiuj przy zapisie to optymalizacja, w której tabele stron są skonfigurowane w taki sposób, że dwa procesy zaczynają współużytkować całą tę samą pamięć, a tylko strony, na których zapisany jest dowolny proces, są kopiowane w razie potrzeby.