GNU/Linux >> Znalost Linux >  >> Linux

Proč je výchozí vidlice mechanismu vytváření procesu?

Systémové volání UNIX pro vytvoření procesu, fork(), vytvoří podřízený proces zkopírováním nadřazeného procesu. Chápu to tak, že téměř vždy následuje volání exec(), které nahradí paměťový prostor podřízeného procesu (včetně textového segmentu). Kopírování paměťového prostoru rodiče ve fork() mi vždy připadalo plýtvání (i když si uvědomuji, že plýtvání lze minimalizovat tím, že se segmenty paměti kopírují při zápisu, takže se kopírují pouze ukazatele). Mimochodem, ví někdo, proč je tento duplikační přístup nutný pro vytváření procesu?

Přijatá odpověď:

Jde o zjednodušení rozhraní. Alternativa k fork a exec by bylo něco jako funkce Windows CreateProcess. Všimněte si, kolik parametrů CreateProcess má a mnoho z nich jsou struktury s ještě více parametry. Je to proto, že vše možná budete chtít mít kontrolu nad tím, že nový proces musí být předán CreateProcess . Ve skutečnosti CreateProcess nemá dostatek parametrů, takže Microsoft musel přidat CreateProcessAsUser a CreateProcessWithLogonW.

Pomocí fork/exec modelu, nepotřebujete všechny tyto parametry. Místo toho jsou určité atributy procesu zachovány v exec . To vám umožní fork , poté změňte libovolné atributy procesu, které chcete (pomocí stejných funkcí, které byste používali normálně), a pak exec . V Linuxu fork nemá žádné parametry a execve má pouze 3:program, který se má spustit, příkazový řádek, který mu dává, a jeho prostředí. (Existují další exec funkce, ale jsou to jen obaly kolem execve poskytuje knihovna C pro zjednodušení běžných případů použití.)

Pokud chcete spustit proces s jiným aktuálním adresářem:fork , chdir , exec .

Pokud chcete přesměrovat stdin/stdout:fork , zavřít/otevřít soubory, exec .

Pokud chcete přepnout uživatele:fork , setuid , exec .

Všechny tyto věci lze kombinovat podle potřeby. Pokud někdo přijde s novým druhem atributu procesu, nemusíte měnit fork a exec .

Jak larsks zmínil, většina moderních Unixů používá kopírování při zápisu, takže fork nezahrnuje významnou režii.


Linux
  1. Proč není CD program?

  2. Nový rodičovský proces, když rodičovský proces zemře?

  3. Grep – Proč závorky ve vzoru Grep odstraňují proces Grep z výsledků PS?

  1. Proč není Pgid procesů dítěte PGID rodiče?

  2. Letmý pohled – vidlička GIMPu

  3. Rozdíl mezi fork(), vfork(), exec() a clone()

  1. BCRYPT – Proč jej distribuce Linuxu nepoužívají ve výchozím nastavení?

  2. Používá jádro Linuxu 3.x plánovač procesů CFS?

  3. Kde je fork() na vidlicové bombě :(){ :|:&};:?