Las pipes de Unix: el invento de 1964 que cambió cómo los programas conversan entre sí

Fuentes: CS 61 2017
Las pipes de Unix: el invento de 1964 que cambió cómo los programas conversan entre sí
Imagen generada con IA

Este contenido explora conceptos fundamentales de los sistemas Unix, centrándose en tres pilares: las pipes (tuberías), la creación de procesos mediante fork(), y los procesos zombis. Las pipes, ideadas por Doug McIlroy en 1964, permiten conectar la salida de un programa directamente con la entrada de otro, funcionando como una manguera de datos que se puede acoplar según necesidad. Esta filosofía de sistemas modulares contrastaba con el enfoque algorítmico de Don Knuth llamado Literate Programming. Un ejemplo práctico mostraré: al ejecutar 'seq 2 100 | less', el programa seq genera números pero less solo muestra lo que cabe en pantalla; cuando el usuario avanza y ya no necesita más datos, el sistema envía una señal SIGPIPE que mata automáticamente a seq, evitando consumir recursos innecesarios. Respecto a fork(), este crea procesos hijos que heredan los descriptores de archivo del padre, incluyendo los extremos de pipes. Para lograr un waitpid блокирующий (bloqueante) sin usar la llamada al sistema waitpid, se puede usar una pipe: el padre cierra el extremo de escritura y lee del extremo de lectura; cuando el hijo muere, todos los extremos de escritura se cierran y read() devuelve 0, desbloqueando al padre. En cuanto a los zombis, cuando un proceso hijo termina pero su padre no ha llamado waitpid para recoger su estado, el hijo queda como zombi (estado Z+). Estos consumen recursos del sistema (PIDs). Si el padre muere antes de esperar, el proceso init (pid 1) adopta a los huérfanos y llama waitpid periódicamente para reciclarlos, evitando saturar el sistema.