Contexte & objectif
Projet réalisé en binôme : implémenter un shell Unix-like en C, sans bibliothèques externes (seule dépendance : readline
). But : comprendre en profondeur le parsing, la gestion des processus et la communication inter-processus.
Fonctionnalités
- Pipelines (
cmd1 | cmd2 | …
) - Redirections :
>
,>>
,<
, here-doc<<
- Variables d’environnement & expansion
- Quoting : simple
'
et double"
- Historique (via
readline
) - Built-ins :
echo
,cd
,pwd
,export
,unset
,env
,exit
- Exécution de binaires externes
Architecture modulaire
- Lexer – tokenize la ligne de commande en tokens.
- Parser – construit une structure de commandes simples / pipelines et valide la syntaxe.
- Expander – remplace les $VAR, gère les quotes et les règles d’expansion.
- Pipes & Redirections – prépare fichiers/FD,
pipe()
,dup2()
pour chaîner STDIN/STDOUT. - Executor – exécute les built-ins in-process ou fork/execve pour les binaires,
waitpid()
pour la synchro.
Points techniques clés
- Appels système :
fork()
,execve()
,waitpid()
,pipe()
,dup2()
,open()/close()
- Gestion des FDs et nettoyage pour éviter fuites/bloquages
- Gestion d’erreurs & codes de retour cohérents avec les usages Unix