Skip to content

Instantly share code, notes, and snippets.

@simark
Created March 10, 2014 02:36
Show Gist options
  • Save simark/9458573 to your computer and use it in GitHub Desktop.
Save simark/9458573 to your computer and use it in GitHub Desktop.
Les étapes entre le moment où on tappe "ls -1 *.txt" suivi de "enter" dans bash et le moment où on peut lire la liste des fichiers à l'écran. C'est très rapide, mais il s'en passe des choses...
$ ls -l undossier *.txt
-rw-rw-r-- 1 simark simark 0 Mar 9 22:17 bob.txt
-rw-rw-r-- 1 simark simark 0 Mar 9 22:17 machin.txt
-rw-rw-r-- 1 simark simark 0 Mar 9 22:17 truc.txt
undossier:
total 0
-rw-rw-r-- 1 simark simark 0 Mar 9 22:29 unfichier
(éventuellement les attributs des fichiers seraient plus intéressants)
=== Partie bash ===
On débute avec l'utilisateur qui appuie sur "enter".
1 Bash effectue une analyse lexicale et syntaxique de la ligne qu'on vient de lui donner: "ls *.txt\n".
2.1 Il remarque que "ls" est le nom du programme qu'on veut exécuter
2.2 Il remarque que "*.txt" est une expression qu'il peut développer, et tente donc de le faire. Il en ressort bob.txt, machin.txt et truc.txt.
3 Bash vérifie si ls fait partie de ses commandes internes.
4 Bash vérifie dans sa table de hachage si une association entre un nom de programme et un chemin existe déjà pour "ls". On suppose que non.
5 Bash obtient la valeur de la variable d'environnement PATH.
6 Bash vérifie dans chacun des dossiers spécifiés dans PATH, si un fichier nommé "ls" s'y trouverait et serait exécutable.
7 Il le trouve dans /bin. Il ajoute cette information à sa table pour plus tard.
8 Bash fourche et exécute /bin/ls, en passant la liste de paramètres développés plus tôt
=== Partie noyau ===
On débute avec le fork de bash.
1 Un nouveau processus est créé. La plupart de l'état du nouveau processus est copié de son parent. Certaines choses sont en copie sur écriture.
2 Un nouvel exécutable remplace celui de Bash dans le processus enfant.
=== Partie libc ===
1 Du code provenant de la bibliothèque standard C utilisée (glibc) est exécuté pour préparer le processus et l'amener jusqu'à l'exécution de la fonction main
=== Partie ls ===
1 ls passe à travers les paramètres qui lui ont été fournis et vérifie ceux qui modifient son comportement (comme -l)
2 Pour chaque chemin passé en paramètre, il effectue son travail.
3 Il explore le contenu du dossier "undossier". Pour chaque fichier trouvé, les attributs sont inspectés.
4 La même chose est faite pour les trois fichiers .txt.
5 La fonction main de ls retourne la valeur 0.
=== Partie libc 2 ===
1 D'autre code de glibc est exécuté pour terminer adéquatement le programme.
=== Partie noyau 2 ===
1 Le processus est maintenant zombie.
2 Un signal SIGCHLD est envoyé au parent (bash)
=== Partie bash 2 ===
1 Bash reçoit le signal SIGCHLD
2 Il vérifie lequel des ses enfants est terminé.
3 Il récupère sa valeur de retour et la place quelque part où $? pourra aller la récupérer.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment