Aller au contenu principal
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