Pourquoi certains programmes reviennent-ils au shell immédiatement alors que d'autres ne le font pas tant que l'exécution n'est pas terminée?

13

J'ai lu dans le livre Modern Operating Systems que lorsqu'une commande est exécutée, le shell crée un processus enfant, l'attend jusqu'à ce que l'enfant ait terminé son exécution, puis attend une autre commande de l'utilisateur. C'est en effet le cas pour de nombreux programmes comme gedit. Le terminal ne prend pas de commandes tant que je n'ai pas fermé gedit. Cependant, lorsque j'ouvre l' éditeur de code atomique , le shell revient immédiatement, prêt à accepter la commande suivante même avec l'éditeur en cours d'exécution. La fermeture du terminal ne ferme pas l' atome. Cela signifie-t-il que l'éditeur n'a pas été ouvert en tant que processus enfant? Quel est le mécanisme sous-jacent qui rend cela possible?

Courir ps au | grep atomdonne

<username>      8042  0.0  0.0  15944  2264 pts/1    S+   00:55   0:00 grep --color=auto atom
Aswin PJ
la source
1
Après avoir démarré l'éditeur d'atomes, pouvez-vous exécuter ps au | grep atomdans le terminal et ajouter une sortie à votre question?
kirill-a
@ kirill-a J'ai mis à jour la question.
Aswin PJ

Réponses:

18

La question porte sur deux types de programmes:

  1. les programmes qui interagissent avec l'utilisateur dans le shell, et
  2. les programmes qui n'interagissent pas avec l'utilisateur dans le shell.

Dans le premier cas, les programmes qui interagissent avec l'utilisateur dans le shell sont conçus pour s'exécuter complètement avant de retourner le contrôle au shell. Rien de spécial n'est fait.

Le deuxième cas est plus compliqué. En règle générale, le programme va bifurquer (faire une copie de lui-même en mémoire), et s'arranger pour supprimer son association avec le terminal de contrôle du shell , et peut exécuter un autre programme - qui s'exécute indépendamment du shell d'origine. Vous pouvez voir des messages du deuxième programme, mais il n'interagit généralement pas avec vous. Selon la façon dont il est utilisé, vous pouvez avoir

  • un processus démon (serveur), ou
  • le programme peut s'exécuter dans une nouvelle fenêtre. Les éditeurs graphiques font ce dernier.

Lectures complémentaires:

Thomas Dickey
la source
La partie concernant la fourche et la dissociation du terminal se fait souvent en appelant la daemonfonction de bibliothèque qui fait tout cela.
kasperd
Pour éviter d'avoir un terminal de contrôle, une double fourche est utilisée
jfs
Aux deux commentaires: la fonction n'est pas dans POSIX, et je suis conscient du contrôle des terminaux, mais j'ai gardé la réponse courte et simple. J'utilise la double fourche depuis la fin des années 80.
Thomas Dickey