Vraag Waarom noemen shells fork ()?


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)


28
2018-03-02 17:39


oorsprong




antwoorden:


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.


33
2018-03-02 17:49



Bijna ok --- ik heb Terminal vervangen door bash. ;-) - Rmano
Trouwens, jij kan vertel bash om grep uit te voeren zonder eerst te forken, door het commando te gebruiken exec grep blabla foo. Natuurlijk, in dit specifieke geval, zal het niet erg nuttig zijn (aangezien je terminalvenster net zal sluiten zodra de grep is voltooid), maar het kan af en toe handig zijn (bijv. Als je een andere shell start, misschien via ssh) / sudo / screen, en niet van plan om terug te keren naar de originele, of als het shell-proces waar je dit op draait een sub-shell is die sowieso nooit bedoeld is om meer dan één commando uit te voeren). - Ilmari Karonen
Instructie set heeft een heel specifieke betekenis. En het is niet de betekenis waarin je het gebruikt. - Andrew Savinykh


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).


3
2018-03-02 18:08





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.


1
2018-03-03 17:45