Ma to na celu uproszczenie interfejsu. Alternatywą forki execbyłoby coś jak Windows' CreateProcess funkcji. Zauważ, ile CreateProcessma 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 CreateProcessnie ma wystarczających parametrów, więc Microsoft musiał dodać CreateProcessAsUser i CreateProcessWithLogonW .
W fork/execmodelu nie potrzebujesz wszystkich tych parametrów. Zamiast tego niektóre atrybuty procesu są zachowywane w poprzek exec. Umożliwia forkto 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 forknie ma parametrów i execvema tylko 3: program do uruchomienia, wiersz poleceń, aby go podać, i jego środowisko. (Istnieją inne execfunkcje, ale są one tylko opakowaniami execvedostarczonymi 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: forkblisko / 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ć forki exec.
Jak wspomniano w Larsku, większość współczesnych Uniksów używa kopiowania przy zapisie, więc forknie 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.