Mètodes
42 (V): pipex, tuberies de Unix
Dup2, fork i descriptors de fitxer: recrear el funcionament de les tuberies de la shell i entendre-les de debò.

Cada dia fas servir tuberies a la terminal sense pensar-hi: grep hello fitxer | wc -l i llest. El projecte pipex de 42 consisteix a recrear aquest mecanisme per dins: un programa que executa dos comandos connectats per una tuberia, amb redirecció d’entrada i sortida a fitxers. Equivalent a un < infile cmd1 | cmd2 > outfile, però escrit des de zero.
El problema
La tuberia és molt fàcil d’usar i molt menys intuïtiva per dins. Per dins, és un parell de descriptors de fitxer: un de lectura i un d’escriptura que connecta dos processos. La complicació real és orquestrar-ho tot alhora: crear el pipe amb pipe(), dividir el programa en dos processos amb fork(), redirigir l’entrada i la sortida estàndard de cada fill amb dup2() perquè la sortida del primer comando entri directament al segon, tancar els descriptors que sobren —si no, el segon mai veurà el final de l’entrada— i executar cada comando amb execve(), trobat prèviament recorrent el PATH de l’entorn. I encara cal portar el compte dels errors: fitxer d’entrada inexistent, comando que no es troba, permisos que no hi són.
Com el vaig abordar
Vaig aprofitar la llibreria de la primera entrega, libft, per a les parts genèriques: separar els comandos en arguments i buscar les rutes. La resta la vaig organitzar en una estructura amb tot l’estat del programa: els descriptors dels fitxers d’entrada i sortida, els extrems del pipe i les rutes resoltes dels dos comandos. Amb l’estat centralitzat, el bucle de processos va quedar net: un fill per comando, redireccions amb dup2, tancament de descriptors en ordre i un pare que espera els dos fills amb waitpid i retorna el codi de sortida del segon. Els detalls que més van costar van ser el tancament correcte dels descriptors —un pipe no tancat i el programa es penja— i reproduir el comportament de la shell davant d’errors: codi 127 si el comando no existeix, 126 si no és executable. El repositori, 42_pipex, inclou libft com a subcarpeta i el codi repartit en mòduls petits: inicialització, execució i alliberament de memòria, cadascun amb el seu fitxer.
Què en vaig treure
Vaig sortir del projecte amb una sensació nova: la terminal havia deixat de ser una caixa negra. Ara sé què passa quan prem Enter i encadeno dos comandos: dos processos, un pipe i unes quantes redireccions. També em va quedar clar que fork i dup2 són la base de mitja internet: la shell, els servidors, els contenedors. I una lliçó de mètode: quan un programa té moltes peces movent-se, centralitzar l’estat en una estructura ben definida és la diferència entre depurar-ho i perdre-t’hi.