Programmation système· 2025· Difficulté
Reproduction d'un shell en C
Un interpréteur de commandes UNIX écrit from scratch
CPOSIXGDBValgrindBashTcsh
Contexte
Projet bas-niveau visant à reconstruire le comportement d'un shell POSIX à partir des appels systèmes.
Objectif
Comprendre en profondeur le cycle fork/exec/wait, la gestion des descripteurs de fichiers, l'analyse lexicale d'une ligne de commande et l'orchestration de processus.
Contraintes
- Aucune fuite mémoire tolérée
- Gestion stricte des codes de retour et des signaux
- Conformité aux normes de codage internes
Fonctionnalités clés
- Parser propre
- Pipes multiples et redirections
- Variables d'environnement et builtins (cd, export, unset, env, ...)
- Gestion des signaux (SIGINT, SIGQUIT) sans corrompre la TTY
- Historique
- Scritping (foreach, if, ...)
- Edition de ligne
Défis & solutions
Problème
Synchronisation correcte des pipes en chaîne avec fermeture des fd parents.
Solution
Fermeture systémique de chaque fd après dup2, et tests reproductibles.
Problème
Quotes imbriquées et expansions de variables dans le parser.
Solution
Séparer tokenisation et expansion, avec table de transitions auditable et tests unitaires ciblés.
Apprentissages
- Maîtrise des appels systèmes UNIX
- Discipline de gestion mémoire et debugging Valgrind
- Architecture modulaire en C avec séparation parser / executor