#include #include #include #include int fd0, fd1; void envoyer(char *msg) { int n = strlen(msg) + 1; write(STDOUT_FILENO, &n, sizeof(int)); write(STDOUT_FILENO, msg, n); } void fils0(void) { int tube[2]; pipe(tube); if(fork() == 0) { /* fils -> ls -l */ dup2(tube[1], 1); close(tube[0]); close(tube[1]); execlp("ls", "ls", "-l", NULL); } else { /* pere */ char buf[1024]; int i, n; close(tube[1]); i = 0; while(1) { n = read(tube[0], &buf[i], 1); if(n < 1) break; if(buf[i] == '\n') { buf[i] = 0; envoyer(buf); i = 0; } i++; } } } void fils1(void) { envoyer("salut !"); } int recevoir(int fd, char *buf) { int n; if(read(fd, &n, sizeof(int)) != sizeof(int)) return -1; read(fd, buf, n); return 0; } void entrelacer(void) { int n; char buf[1024]; while (fd0 != -1 || fd1 != -1) { if(fd0 != -1) { if(recevoir(fd0, buf) == 0) printf("Fils 0: %s\n", buf); else fd0 = -1; } if(fd1 != -1) { if(recevoir(fd1, buf) == 0) printf("Fils 1: %s\n", buf); else fd1 = -1; } } } void ls_l(void) { } int main(int argc, char *argv[]) { pid_t pid; int tube[2]; pipe(tube); pid = fork(); if(pid == 0) { /* fils 0 */ dup2(tube[1], 1); close(tube[0]); close(tube[1]); fils0(); exit(0); } fd0 = tube[0]; close(tube[1]); pipe(tube); pid = fork(); if(pid == 0) { /* fils 1 */ close(fd0); dup2(tube[1], 1); close(tube[0]); close(tube[1]); fils1(); exit(0); } fd1 = tube[0]; close(tube[1]); entrelacer(); return 0; }