Ma to na celu uproszczenie interfejsu. Alternatywą fork
i exec
byłoby coś jak Windows' CreateProcess funkcji. Zauważ, ile CreateProcess
ma parametrów , a wiele z nich to struktury o jeszcze większej liczbie parametrów. Dzieje się tak, ponieważ wszystko , co możesz chcieć kontrolować nad nowym procesem, musi zostać przekazane CreateProcess
. W rzeczywistości CreateProcess
nie ma wystarczających parametrów, więc Microsoft musiał dodać CreateProcessAsUser i CreateProcessWithLogonW .
W fork/exec
modelu nie potrzebujesz wszystkich tych parametrów. Zamiast tego niektóre atrybuty procesu są zachowywane w poprzek exec
. Umożliwia fork
to zmianę, a następnie zmianę dowolnych atrybutów procesu (przy użyciu tych samych funkcji, których normalnie używasz), a następnie exec
. W Linuksie fork
nie ma parametrów i execve
ma tylko 3: program do uruchomienia, wiersz poleceń, aby go podać, i jego środowisko. (Istnieją inne exec
funkcje, ale są one tylko opakowaniami execve
dostarczonymi przez bibliotekę C w celu uproszczenia typowych przypadków użycia).
Jeśli chcesz, aby rozpocząć proces z innego katalogu bieżącego: fork
, chdir
, exec
.
Jeśli chcesz przekierować stdin / stdout: fork
blisko / Otwórz pliki exec
.
Jeśli chcesz użytkowników przełączników: fork
, setuid
, exec
.
Wszystkie te rzeczy można łączyć w razie potrzeby. Jeśli ktoś wymyśli nowy rodzaj atrybutu procesu, nie musisz go zmieniać fork
i exec
.
Jak wspomniano w Larsku, większość współczesnych Uniksów używa kopiowania przy zapisie, więc fork
nie wiąże się to z dużym nakładem pracy .
fork(2)
strona podręcznika pod Linuksem mówi:Under Linux, fork() is implemented using copy-on-write pages, so the only penalty that it incurs is the time and memory required to duplicate the parent's page tables, and to create a unique task structure for the child.
Wyobrażam sobie (ale nie jestem pewien), że tak jest w przypadku innych współczesnych smaków uniksowych.