Architecture d'un Mini Shell

Cliquez sur un module pour voir les détails

1

1. LECTURE ENTRÉE

getline()printf()fflush()
2

2. PARSING

strtok()split_line()
3

3. BUILT-INS

is_builtin()builtin_env()exit()
4

4. RECHERCHE PATH

find_in_path()_getenv()stat()
5

5. CRÉATION PROCESSUS

fork()
6

6. EXÉCUTION

execve()
7

7. ATTENTE

wait()waitpid()
8

8. NETTOYAGE

free()
BOUCLE INFINIE

🔄 Flux de Traitement d'une Commande

$ ls -l /tmp

👨‍💻 Processus Parent (Shell)

  1. 1.Lit "ls -l /tmp"
  2. 2.Découpe en ["ls", "-l", "/tmp", NULL]
  3. 3.Vérifie si c'est un built-in → Non
  4. 4.Cherche "ls" dans PATH → /bin/ls
  5. 5.Appelle fork() → reçoit PID enfant
  6. 6.Appelle wait() → se met en pause ⏸️
  7. 7.Enfant termine → se réveille ✅
  8. 8.Libère mémoire et affiche nouveau prompt

👶 Processus Enfant

  1. 1.Créé par fork() → reçoit 0
  2. 2.A une copie de toutes les données
  3. 3.Appelle execve("/bin/ls", args, env)
  4. 4.Son code est REMPLACÉ par /bin/ls 🔄
  5. 5.Le programme "ls" s'exécute
  6. 6.Affiche la liste des fichiers 📁
  7. 7.Se termine avec exit(0)
  8. 8.Le parent est notifié 📨

🚨 Erreurs Critiques

  • ❌ Oublier NULL dans argv
  • ❌ Ne pas appeler wait()
  • ❌ Ne pas free() la mémoire
  • ❌ Oublier environ dans execve()
  • ❌ Ne pas gérer EOF

✅ Bonnes Pratiques

  • ✓ Toujours vérifier les retours
  • ✓ Utiliser fflush(stdout)
  • ✓ Libérer avant exit()
  • ✓ Gérer les erreurs avec perror()
  • ✓ Tester mode interactif/non-interactif

🎯 Ordre d'Implémentation

  1. 1️⃣ Shell sans arguments
  2. 2️⃣ Ajouter parsing arguments
  3. 3️⃣ Ajouter recherche PATH
  4. 4️⃣ Ajouter built-in exit
  5. 5️⃣ Ajouter built-in env

🤔 Pourquoi Chaque Module est Indispensable

Sans INPUT/PARSING :

Le shell ne peut pas comprendre ce que vous tapez

Sans BUILT-INS :

Impossible de quitter le shell ou voir l'environnement

Sans PATH :

Il faudrait taper "/bin/ls" au lieu de juste "ls"

Sans FORK :

Si la commande crash, tout le shell crash

Sans EXECVE :

Aucune commande ne peut réellement s'exécuter

Sans WAIT :

Processus zombies partout + prompt réaffiche trop tôt

Sans CLEANUP :

Fuites mémoire → shell devient de + en + lent

Tous ensemble :

Un shell fonctionnel, robuste et efficace ! 🎉

💡 Astuce : Implémentez module par module, testez chaque étape !