#include #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) { envoyer("coucou !"); envoyer("ça va ?"); } 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 *tache(void *arg) { int num = (int)(arg); char buf[1024]; int fd, n; fd = num ? fd1 : fd0; do { n = recevoir(fd, buf); if(n != 0) break; printf("Fils %d: %s\n", num, buf); } while(1); return NULL; } void entrelacer(void) { int n; pthread_t p1, p2; pthread_create(&p1, NULL, tache, (void *)0); pthread_create(&p2, NULL, tache, (void *)1); pthread_join(p1, NULL); pthread_join(p2, NULL); } 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; }