This commit is contained in:
Ladebeze66 2025-02-10 17:16:32 +01:00
parent 6612e76ade
commit 46c7beb531

View File

@ -12,81 +12,109 @@ Gestion des Signaux : Manipuler les signaux pour gérer les interruptions et les
Implémentation des Redirections et des Pipes : Gérer les redirections d'entrée/sortie (<, >, >>) et les pipes (|) pour permettre la communication entre processus. Implémentation des Redirections et des Pipes : Gérer les redirections d'entrée/sortie (<, >, >>) et les pipes (|) pour permettre la communication entre processus.
🛠️ Spécifications Techniques 🛠️ Spécifications Techniques
Fonctionnalités à Implémenter : Fonctionnalités à Implémenter :
Affichage d'un Prompt : Afficher un prompt personnalisé en attente des commandes de l'utilisateur. Affichage d'un Prompt : Afficher un prompt personnalisé en attente des commandes de l'utilisateur.
Historique des Commandes : Maintenir un historique des commandes exécutées pour permettre la navigation et la réexécution. Historique des Commandes : Maintenir un historique des commandes exécutées pour permettre la navigation et la réexécution.
Exécution des Commandes : Localiser et exécuter les exécutables en se basant sur la variable d'environnement PATH ou via un chemin absolu. Exécution des Commandes : Localiser et exécuter les exécutables en se basant sur la variable d'environnement PATH ou via un chemin absolu.
Gestion des Citations Simples et Doubles : Gérer les guillemets simples (') et doubles (") pour empêcher ou permettre l'interprétation des métacaractères. Gestion des Citations Simples et Doubles : Gérer les guillemets simples (') et doubles (") pour empêcher ou permettre l'interprétation des métacaractères.
Redirections : Redirections :
Entrée (<) : Rediriger l'entrée standard depuis un fichier. Entrée (<) : Rediriger l'entrée standard depuis un fichier.
**Sortie (>) : Rediriger la sortie standard vers un fichier, en écrasant le contenu existant. **Sortie (>) : Rediriger la sortie standard vers un fichier, en écrasant le contenu existant.
**Append (>>) : Rediriger la sortie standard vers un fichier, en ajoutant au contenu existant. **Append (>>) : Rediriger la sortie standard vers un fichier, en ajoutant au contenu existant.
**Heredoc (<<) : Lire l'entrée jusqu'à un délimiteur spécifié, sans mettre à jour l'historique. **Heredoc (<<) : Lire l'entrée jusqu'à un délimiteur spécifié, sans mettre à jour l'historique.
Pipes (|) : Connecter la sortie d'une commande à l'entrée d'une autre, permettant la création de pipelines. Pipes (|) : Connecter la sortie d'une commande à l'entrée d'une autre, permettant la création de pipelines.
Variables d'Environnement : Gérer l'expansion des variables d'environnement ($VARIABLE) et de la variable $? pour le statut de sortie de la dernière commande exécutée. Variables d'Environnement : Gérer l'expansion des variables d'environnement ($VARIABLE) et de la variable $? pour le statut de sortie de la dernière commande exécutée.
Gestion des Signaux : Gestion des Signaux :
Ctrl+C : Afficher un nouveau prompt sur une nouvelle ligne. Ctrl+C : Afficher un nouveau prompt sur une nouvelle ligne.
Ctrl+D : Quitter le shell. Ctrl+D : Quitter le shell.
Ctrl+\ : Ne rien faire. Ctrl+\ : Ne rien faire.
Built-ins à Implémenter : Built-ins à Implémenter :
echo : Avec l'option -n pour supprimer le saut de ligne final. echo : Avec l'option -n pour supprimer le saut de ligne final.
cd : Changer le répertoire de travail actuel. cd : Changer le répertoire de travail actuel.
pwd : Afficher le répertoire de travail actuel. pwd : Afficher le répertoire de travail actuel.
export : Définir des variables d'environnement. export : Définir des variables d'environnement.
unset : Supprimer des variables d'environnement. unset : Supprimer des variables d'environnement.
env : Afficher les variables d'environnement actuelles. env : Afficher les variables d'environnement actuelles.
exit : Quitter le shell. exit : Quitter le shell.
🔧 Approche d'Implémentation 🔧 Approche d'Implémentation
Lecture de l'Entrée : Lecture de l'Entrée :
Utiliser la fonction readline pour afficher le prompt et lire l'entrée de l'utilisateur. Utiliser la fonction readline pour afficher le prompt et lire l'entrée de l'utilisateur.
Ajouter les commandes saisies à l'historique à l'aide de add_history. Ajouter les commandes saisies à l'historique à l'aide de add_history.
Analyse Lexicale (Lexer) : Analyse Lexicale (Lexer) :
Diviser l'entrée en tokens pour identifier les commandes, arguments, opérateurs, etc. Diviser l'entrée en tokens pour identifier les commandes, arguments, opérateurs, etc.
Analyse Syntaxique (Parser) : Analyse Syntaxique (Parser) :
Construire une structure de données représentant la commande et ses composants, en tenant compte de la priorité des opérateurs et des parenthèses. Construire une structure de données représentant la commande et ses composants, en tenant compte de la priorité des opérateurs et des parenthèses.
Expansion : Expansion :
Gérer l'expansion des variables d'environnement et le traitement des guillemets. Gérer l'expansion des variables d'environnement et le traitement des guillemets.
Exécution : Exécution :
Implémenter les built-ins directement dans le shell. Implémenter les built-ins directement dans le shell.
Pour les autres commandes, utiliser fork pour créer un processus enfant et execve pour exécuter la commande. Pour les autres commandes, utiliser fork pour créer un processus enfant et execve pour exécuter la commande.
Gérer les redirections et les pipes en ajustant les descripteurs de fichiers à l'aide de dup2. Gérer les redirections et les pipes en ajustant les descripteurs de fichiers à l'aide de dup2.
Gestion des Signaux : Gestion des Signaux :
Configurer des gestionnaires de signaux pour intercepter Ctrl+C, Ctrl+D et Ctrl+\ et appliquer le comportement approprié. Configurer des gestionnaires de signaux pour intercepter Ctrl+C, Ctrl+D et Ctrl+\ et appliquer le comportement approprié.
📂 Structure du Projet
Fichiers Principaux :
main.c : Point d'entrée du programme, gère la boucle principale du shell.
lexer.c : Contient les fonctions pour l'analyse lexicale de l'entrée utilisateur.
parser.c : Gère l'analyse syntaxique et la construction de la commande.
Fichiers Principaux (Suite) :
executor.c : Contient les fonctions pour l'exécution des commandes et la gestion des processus.
builtins.c : Implémente les commandes internes (cd, echo, export, etc.).
signals.c : Gestion des signaux (Ctrl+C, Ctrl+D, Ctrl+\).
utils.c : Fonctions utilitaires (gestion de la mémoire, affichage d'erreurs, etc.).
Bibliothèques Utilisées : Bibliothèques Utilisées :
readline : Pour la gestion du prompt et de lhistorique des commandes. readline : Pour la gestion du prompt et de lhistorique des commandes.
unistd.h : Pour les appels système (fork, execve, dup2). unistd.h : Pour les appels système (fork, execve, dup2).
signal.h : Pour la gestion des signaux. signal.h : Pour la gestion des signaux.
stdlib.h et string.h : Pour la manipulation des chaînes et allocation dynamique. stdlib.h et string.h : Pour la manipulation des chaînes et allocation dynamique.
🧪 Tests et Validation 🧪 Tests et Validation
Tests Fonctionnels : Tests Fonctionnels :
Vérifier que chaque commande interne (cd, pwd, etc.) fonctionne correctement. Vérifier que chaque commande interne (cd, pwd, etc.) fonctionne correctement.
Vérifier la gestion des redirections (<, >, >>) et des pipes (|). Vérifier la gestion des redirections (<, >, >>) et des pipes (|).
Vérifier lexpansion des variables ($USER, $HOME, etc.). Vérifier lexpansion des variables ($USER, $HOME, etc.).
Assurer la bonne gestion des erreurs (commandes inconnues, fichiers inexistants, etc.). Assurer la bonne gestion des erreurs (commandes inconnues, fichiers inexistants, etc.).
Tests de Robustesse : Tests de Robustesse :
Exécuter le shell avec des entrées non valides pour observer le comportement. Exécuter le shell avec des entrées non valides pour observer le comportement.
@ -94,21 +122,32 @@ Tester la gestion des signaux (Ctrl+C, Ctrl+D) pour éviter les comportements in
Vérifier la gestion de la mémoire avec valgrind pour éviter les fuites. Vérifier la gestion de la mémoire avec valgrind pour éviter les fuites.
Tests de Performance : Tests de Performance :
Exécuter un grand nombre de commandes en boucle pour évaluer la stabilité. Exécuter un grand nombre de commandes en boucle pour évaluer la stabilité.
Tester lexécution simultanée de plusieurs processus avec des pipes. Tester lexécution simultanée de plusieurs processus avec des pipes.
📚 Ressources Utiles 📚 Ressources Utiles
📂 Dépôts GitHub : 📂 Dépôts GitHub :
[mcombeau/minishell : Une implémentation complète avec explications.][https://github.com/mcombeau/minishell] [mcombeau/minishell : Une implémentation complète avec explications.][https://github.com/mcombeau/minishell]
[tjensen42/42-minishell : Version alternative mettant laccent sur les processus.][https://github.com/tjensen42/42-minishell] [tjensen42/42-minishell : Version alternative mettant laccent sur les processus.][https://github.com/tjensen42/42-minishell]
📖 Articles et Guides : 📖 Articles et Guides :
[Minishell: Building a mini-bash : Explication détaillée du projet.][https://m4nnb3ll.medium.com/minishell-building-a-mini-bash-a-42-project-b55a10598218] [Minishell: Building a mini-bash : Explication détaillée du projet.][https://m4nnb3ll.medium.com/minishell-building-a-mini-bash-a-42-project-b55a10598218]
[42Docs - Minishell : Documentation technique avec conseils dimplémentation.][https://harm-smits.github.io/42docs/projects/minishell] [42Docs - Minishell : Documentation technique avec conseils dimplémentation.][https://harm-smits.github.io/42docs/projects/minishell]
[Minishell Guide 42 Cursus : Guide complet du projet.][https://42-cursus.gitbook.io/guide/rank-03/minishell] [Minishell Guide 42 Cursus : Guide complet du projet.][https://42-cursus.gitbook.io/guide/rank-03/minishell]
🎥 Tutoriels Vidéo : 🎥 Tutoriels Vidéo :
[42-Minishell - YouTube Playlist : Série de vidéos sur le développement de Minishell.][https://www.youtube.com/playlist?list=PLGU1kcPKHMKj5yA0RPb5AK4QAhexmQwrW] [42-Minishell - YouTube Playlist : Série de vidéos sur le développement de Minishell.][https://www.youtube.com/playlist?list=PLGU1kcPKHMKj5yA0RPb5AK4QAhexmQwrW]
[Shell programming & Process management : Introduction aux shells Unix et gestion des processus.][https://www.youtube.com/watch?v=ZJFIwsL9I1Y] [Shell programming & Process management : Introduction aux shells Unix et gestion des processus.][https://www.youtube.com/watch?v=ZJFIwsL9I1Y]
🚀 Pourquoi ce projet est important ? 🚀 Pourquoi ce projet est important ?
Le projet Minishell est un exercice clé pour comprendre comment fonctionne un shell Unix. Il permet d'acquérir des compétences avancées en gestion des processus, redirections dentrée/sortie, gestion de la mémoire, et synchronisation des tâches. Ces compétences sont essentielles pour les développeurs systèmes, DevOps et ingénieurs en logiciels bas niveau. 🔥 Le projet Minishell est un exercice clé pour comprendre comment fonctionne un shell Unix. Il permet d'acquérir des compétences avancées en gestion des processus, redirections dentrée/sortie, gestion de la mémoire, et synchronisation des tâches. Ces compétences sont essentielles pour les développeurs systèmes, DevOps et ingénieurs en logiciels bas niveau. 🔥