#define _POSIX_C_SOURCE 200112L #include #include #include #include #include #include "err.h" int main(int argc, char *argv[]) { int d[2]; pipe(d); switch(fork()) { case -1: FATAL("fork"); break; case 0: // Le fils exécute ls et écrit dans le tube. // Il n'utilise pas le tube en lecture. close(d[0]); // Il redirige sa sortie vers la partie "écriture" du tube. if (dup2(d[1], STDOUT_FILENO) == -1) FATAL("dup2"); // Il ferme le descripteur d[1] qui a été dupliqué. close(d[1]); execlp("ls", "ls", NULL); // NOT REACHED FATAL("exec"); default: // Le père exécute grep a en lisant depuis le tube. Symétrique. // close(d[1]); // OUBLI DE FERMER LE BOUT ECR. if (dup2(d[0], STDIN_FILENO) == -1) FATAL("dup2"); close(d[0]); execlp("grep", "grep", "a", NULL); // NOT REACHED FATAL("exec"); } return EXIT_SUCCESS; }