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

int main(int argc, char **argv){
	int fds_P_C1[2];
	int fds_C1_C2[2];
	pipe(fds_P_C1);
	pipe(fds_C1_C2);
	int pid1=fork();
	if (pid1==0){
		//Child1
		close(fds_P_C1[1]);
		close(fds_C1_C2[0]);
		int g_C1;
		read(fds_P_C1[0],&g_C1,sizeof(int));
		printf("CHILD1 has received %d from the PARENT\n",g_C1);
		g_C1*=2;
		write(fds_C1_C2[1],&g_C1,sizeof(int));
		return 0;
	}

	int pid2=fork();
	if (pid2==0){
		//Child2
		close(fds_P_C1[0]);
		close(fds_P_C1[1]);
		close(fds_C1_C2[1]);
		int fds_C3_C2[2];
		pipe(fds_C3_C2);
		int pid3=fork();
		if (pid3==0){
			//CHILD3
			close(fds_C3_C2[0]);
			int g_C3=3;
			write(fds_C3_C2[1],&g_C3,sizeof(int));
			return 0;
		}
		//CHILD2
		close(fds_C3_C2[1]);
		int g_C2;
		read(fds_C1_C2[0],&g_C2,sizeof(int));
		printf("CHILD2 has read %d from CHILD1\n",g_C2);
		int g_C2_C3;
		read(fds_C3_C2[0],&g_C2_C3,sizeof(int));
		printf("CHILD2 has read %d from CHILD3\n",g_C2_C3);
		printf("The final result is %d\n",g_C2_C3+g_C2);
		waitpid(pid3,NULL,0);
		return 0;
	}
	//PARENT
	close(fds_C1_C2[0]);
	close(fds_C1_C2[1]);
	int g_P=4;
	write(fds_P_C1[1],&g_P,sizeof(int));
	waitpid(pid1,NULL,0);
	waitpid(pid2,NULL,0);
	return 0;	
}
