Wanneer een proces wordt gestart vanuit een shell, waarom vist de shell dan zelf voordat het proces wordt uitgevoerd?
Bijvoorbeeld wanneer de gebruiker invoert grep blabla foo
, waarom kan de schelp niet gewoon bellen exec()
op grep zonder childshell?
Als een shell zichzelf binnen een GUI-terminalemulator comprimeert, start hij dan ook een andere terminalemulator? (zoals pts/13
beginnend pts/14
)
Wanneer u belt exec
gezinsmethode maakt het in plaats daarvan geen nieuw proces exec
vervangt het huidige procesgeheugen en de instructieset enz. met het proces dat u wilt uitvoeren.
Als een voorbeeld wilt u uitvoeren grep
met behulp van exec. bash
is een proces (met een afzonderlijk geheugen, adresruimte). Nu, wanneer u belt exec(grep)
, exec zal het huidige procesgeheugen, adresruimte, instructieset enz. vervangen met grep's
gegevens. Dat betekent bash
proces zal niet langer bestaan. Als gevolg hiervan kun je niet terug naar de terminal na het voltooien van de grep
opdracht. Dat is de reden waarom exec-gezinsmethoden nooit meer terugkeren. Je kunt na exec geen code uitvoeren; het is onbereikbaar.
Volgens de pts
, controleer het zelf: in een shell, rennen
echo $$
om uw proces-id (PID) te kennen, heb ik bijvoorbeeld
echo $$
29296
Dan start je bijvoorbeeld sleep 60
en dan in een andere terminal
(0)samsung-romano:~% ps -edao pid,ppid,tty,command | grep 29296 | grep -v grep
29296 2343 pts/11 zsh
29499 29296 pts/11 sleep 60
Dus nee, over het algemeen heb je dezelfde tty die hoort bij het proces. (Merk op dat dit van u is sleep
omdat het je shell als ouder heeft).
Voor elke opdracht (bijvoorbeeld: grep) die u opgeeft bij de bash-prompt, bent u eigenlijk van plan een nieuw proces te starten en vervolgens na uitvoering terug te keren naar de bash-prompt.
Als het shell-proces (bash) exec () aanroept om grep uit te voeren, wordt het shell-proces vervangen door grep. Grep werkt prima, maar na uitvoering kan de besturing niet terugkeren naar de shell omdat het bash-proces al is vervangen.
Om deze reden roept bash fork () aan, wat het huidige proces niet vervangt.