#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/wait.h>

int main(){

	int tube1[2], tube2[2];
	int ent=0, pid1, pid2, tmp;

	if (pipe(tube1)<0) {
		perror ("erreur ouverture pipe"); exit(1);
	}
	if ((pid1=fork())<0) {
		perror ("erreur fork"); exit(1);
	}

	if (pid1 != 0) {//père
		if (close(tube1[1])<0) exit(1); /*père n'écrit pas dans tube1 */
		if (pipe(tube2)<0) {
			perror ("erreur ouverture pipe"); exit(1);
		}
		if ((pid2=fork())<0) {
			perror ("erreur fork"); exit(1);
		}
		if (pid2 != 0) { //père
			if (close(tube2[1])<0) exit(1); /*père n'écrit pas dans tube2 */
			
			while(read(tube1[0],&tmp,sizeof(int))==sizeof(int)){
				printf("reçu fils1 : %d\n", tmp);
				ent += tmp;
			}
			if (close(tube1[0])<0) exit(1); /*père ne lit plus dans tube1 */
			while(read(tube2[0],&tmp,sizeof(int))==sizeof(int)){
				printf("reçu fils2 : %d\n", tmp);
				ent += tmp;
			}
			if (close(tube2[0])<0) exit(1); /*père ne lit plus dans tube2 */
			printf("%d\n", ent);

			if (wait(&pid1)<0) exit(1);
			if (wait(&pid2)<0) exit(1);
		}
		else{ //fils2
			if (close(tube1[0])<0) exit(1); /*fils2 ne lit pas dans tube1 */
			if (close(tube2[0])<0) exit(1); /*fils2 ne lit pas dans tube2 */
			for(int i=0;i<10;i++){
				ent++;
				if (write(tube2[1], &ent, sizeof(int))<0) exit(1);
				sleep(0.1);
			}
			if (close(tube2[1])<0) exit(1); /*fils2 n'écrit plus dans tube2 */
		}
	}
	else { //fils1
		if (close(tube1[0])<0) exit(1); /*fils1 ne lit pas dans tube1 */
		for(int i=0;i<20;i++){
			ent++;
			if (write(tube1[1], &ent, sizeof(int))<0) exit(1);
			sleep(0.5);
		}
		if (close(tube1[1])<0) exit(1); /*fils1 n'écrit plus dans tube1 */
	}
}