Pourquoi les shells appellent fork ()?

28

Lorsqu'un processus est lancé à partir d'un shell, pourquoi le shell se branche-t-il avant d'exécuter le processus?

Par exemple, lorsque l'utilisateur saisit grep blabla foo , pourquoi le shell ne peut-il pas appeler exec() sur grep sans shell enfant?

En outre, lorsqu'un shell se forge dans un émulateur de terminal graphique, démarre-t-il un autre émulateur de terminal? (tel que pts/13 % de départ pts/14 )

    
posée user3122885 02.03.2014 - 18:39
la source

3 réponses

33

Lorsque vous appelez une méthode de la famille exec , elle ne crée pas de nouveau processus, mais exec remplace la mémoire de processus actuelle et le jeu d'instructions, etc., par le processus à exécuter.

Par exemple, vous voulez exécuter grep en utilisant exec. bash est un processus (qui a une mémoire séparée, un espace d'adressage). Maintenant, lorsque vous appelez exec(grep) , exec remplace la mémoire, l'espace adresse, le jeu d'instructions, etc. du processus en cours par les données grep's . Cela signifie que le processus bash n'existera plus. En conséquence, vous ne pouvez pas revenir au terminal après avoir terminé la commande grep . C'est pourquoi les méthodes de la famille exec ne reviennent jamais. Vous ne pouvez pas exécuter de code après exec; c'est inaccessible.

    
réponse donnée shantanu 02.03.2014 - 18:49
la source
3

Selon le pts , vérifiez vous-même: dans un shell, exécutez

echo $$ 

pour connaître votre identifiant de processus (PID), j'ai par exemple

echo $$
29296

Ensuite, exécutez par exemple sleep 60 puis, dans un autre 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

Alors non, en général vous avez le même tty associé au processus. (Notez que ceci est votre sleep car il a votre shell en tant que parent).

    
réponse donnée Rmano 02.03.2014 - 19:08
la source
1

Pour chaque commande (exemple: grep) que vous émettez à l'invite bash, vous avez réellement l'intention de lancer un nouveau processus, puis de revenir à l'invite bash après son exécution.

Si le processus shell (bash) appelle exec () pour exécuter grep, le processus shell sera remplacé par grep. Grep fonctionnera bien mais après exécution, le contrôle ne peut pas retourner dans le shell car le processus bash est déjà remplacé.

Pour cette raison, bash appelle fork (), qui ne remplace pas le processus en cours.

    
réponse donnée FlowRaja 03.03.2014 - 18:45
la source

Lire d'autres questions sur les étiquettes