PIPEX
Le projet pipex consiste à reproduire le comportement des pipes (|) et des redirections (<, >) de shell
en C, sans utiliser de fonctions interdites comme system() ou fork().
Contraintes principales
1. Fonctionnement de base
Le programme doit prendre 4 arguments :
sh
./pipex fichier1 cmd1 cmd2 fichier2
Et doit se comporter comme :
sh
< fichier1 cmd1 | cmd2 > fichier2
Exemple :
sh
./pipex [Link] "grep a" "wc -l" [Link]
→ Doit être équivalent à :
sh
< [Link] grep a | wc -l > [Link]
2. Gestion des fichiers et processus
Lecture/écriture :
fichier1 → entrée de cmd1.
fichier2 → sortie de cmd2.
Execution des commandes :
Doit utiliser execve() (pas system()).
Doit gérer les paths (ex: /usr/bin/grep vs grep).
Doit gérer les arguments ("ls -l" → ["ls", "-l", NULL]).
Pipes et processus :
Doit créer 2 processus (fork() deux fois).
Doit rediriger les flux avec dup2().
Doit fermer les file descriptors correctement (close()).
3. Gestion des erreurs
Le programme doit gérer :
Fichiers inaccessibles (open() échoue).
Commandes introuvables (execve() échoue).
Pipes/forks qui échouent.
Doit afficher un message d’erreur clair (perror() autorisé).
4. Bonus (optionnel)
Gérer plusieurs pipes (ex: cmd1 | cmd2 | cmd3).
Gérer les heredoc (<<) comme dans :
sh
./pipex here_doc LIMITER cmd1 cmd2 fichier2
→ Doit lire l’entrée jusqu’à LIMITER avant d’exécuter cmd1.
Gérer les redirections >> (append au lieu d’écraser).
Exemple d’exécution
sh
./pipex [Link] "cat" "grep Hello" [Link]
→ Lit [Link], passe dans cat, filtre avec grep Hello, écrit dans [Link].
Conseils pour commencer
Comprendre les pipes UNIX (pipe(), dup2(), fork()).
Parser les commandes (split "ls -l" en ["ls", "-l"]).
Gérer les paths (vérifier /usr/bin/ si la commande n’est pas trouvée).
Bien fermer les file descriptors pour éviter des leaks.