Lorsque vous tapez des commandes, vous utilisez un programme appelé shell de ligne de commande. Il s'agit d'un programme qui lit les entrées, analyse le texte qu'il reçoit et exécute les commandes contenues dans le texte.
Para g++ abc.cpp
la coquille regarde vers le haut g++
et trouve qu'il s'agit du nom d'un fichier exécutable (soit directement, soit parce que c'est un lien vers un fichier réel). Il exécute ensuite ce fichier. C'est un processus assez compliqué qui inclut la création d'un processus enfant qui charge le fichier exécutable en mémoire et l'exécute ensuite. (Note : Certains fichiers exécutables sont des shell scripts plutôt que des exécutables binaires contenant des instructions machine. Les scripts sont exécutés en chargeant le programme shell et en lui disant d'exécuter le scripts).
El g++
Le programme analyse ensuite les arguments qui lui ont été donnés. Dans le cas de g++ abc.cpp
il ouvrira "abc.cpp" et le compilera. g++
est un programme comme n'importe quel programme que vous pouvez écrire : Il lit des fichiers, effectue des calculs et écrit des fichiers.
g++
peut être un exécutable unique qui fait beaucoup de choses, mais il effectue probablement une grande partie de son travail en créant des sous-processus supplémentaires pour exécuter d'autres programmes. Il peut y avoir un programme distinct pour effectuer la compilation du code et un autre pour lier le code à un exécutable. (Il peut également y avoir des programmes séparés pour le prétraitement et l'optimisation, ainsi que pour la compilation du code dans un langage intermédiaire, puis pour la génération du langage d'assemblage, puis pour l'assemblage du langage d'assemblage, mais ceux-ci peuvent également être intégrés dans un seul programme).
Il y a de nombreuses interactions avec le système dans ce processus. L'ouverture de fichiers, leur lecture et leur écriture nécessitent des appels système. Votre question semble essentiellement porter sur l'exécution de programmes.
En gros, sur Unix et les systèmes similaires, les étapes impliquées dans un programme provoquant l'exécution d'un autre sont les suivantes :
- Le programme appelle
fork
. Il s'agit d'un appel système qui crée un double du processus. Lorsque cela est fait, il y a deux copies du même processus. L'une est appelée le parent et l'autre l'enfant. Le système indique à chaque processus s'il est le parent ou l'enfant par une valeur de retour de la fonction fork
appeler.
- Le programme examine les
fork
pour voir s'il s'agit du parent ou de l'enfant. S'il s'agit de l'enfant, il appelle une routine dans le fichier exec
famille pour exécuter un autre programme.
- El
exec
ouvre le fichier contenant le programme à exécuter et le lit en mémoire. Il s'agit d'interpréter le contenu du fichier exécutable, car ce dernier n'est pas seulement des données brutes. Il contient une variété de structures qui décrivent différentes choses à mettre en mémoire lors de la préparation de l'exécution du programme.
- Une grande partie du travail de l
exec
L'appel peut se faire de manière ordinaire : Ouvrir un fichier, lire son contenu, analyser son contenu et organiser les choses en mémoire. De plus, les fichiers exécutables peuvent utiliser des bibliothèques partagées, et leur chargement nécessitera l'ouverture d'autres fichiers et leur chargement. Cependant, le exec
sera assisté dans une certaine mesure par des appels système qui modifient les mappages de mémoire pour le processus et effectuent d'autres tâches.
- Finalement, lorsque le programme à exécuter est suffisamment chargé en mémoire, le logiciel qui le charge transfère le contrôle à son adresse de départ, et le processus exécute alors le nouveau programme.
(J'ai sans doute fait peu de cas de la exec
et les processus de chargement, et éventuellement d'autres questions abordées ci-dessus).