Answer:
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<sys/types.h>
#include<string.h>
#include<pthread.h>
//#include<sys/wait.h>
int main(int argc, char** argv)
{
int fd1[2];
int fd2[2];
int fd3[2];
int fd4[2];
char message[] = "abcd";
char input_str[100];
pid_t p,q;
if (pipe(fd1)==-1)
{
  fprintf(stderr, "Pipe Failed" );
  return 1;
}
if (pipe(fd2)==-1)
{
  fprintf(stderr, "Pipe Failed" );
  return 1;
}
if (pipe(fd3)==-1)
{
  fprintf(stderr, "Pipe Failed" );
  return 1;
}
if (pipe(fd4)==-1)
{
  fprintf(stderr, "Pipe Failed" );
  return 1;
}
p = fork();
if (p < 0)
{
  fprintf(stderr, "fork Failed" );
return 1;
}
// child process-1
else if (p == 0)
{
  close(fd1[0]);// Close reading end of first pipe
  char concat_str[100];
  printf("\n\tEnter meaaage:"):
  scanf("%s",concat_str);
  write(fd1[1], concat_str, strlen(concat_str)+1);
  // Concatenate a fixed string with it
  int k = strlen(concat_str);
  int i;
  for (i=0; i<strlen(fixed_str); i++)
  {
   concat_str[k++] = fixed_str[i];
  }
  concat_str[k] = '\0';//string ends with '\0'
  // Close both writting ends
  close(fd1[1]);
  wait(NULL);
//.......................................................................
  close(fd2[1]);
  read(fd2[0], concat_str, 100);
  if(strcmp(concat_str,"invalid")==0)
  {
  printf("\n\tmessage not send");
  }
  else
  {
   printf("\n\tmessage send to prog_2(child_2).");
  }
  close(fd2[0]);//close reading end of pipe 2
  exit(0);
}
else
{
  close(fd1[1]);//Close writting end of first pipe
  char concat_str[100];
  read(fd1[0], concal_str, strlen(concat_str)+1);
  close(fd1[0]);
  close(fd2[0]);//Close writing end of second pipe
  if(/*check if msg is valid or not*/)
  {
   //if not then
   write(fd2[1], "invalid",sizeof(concat_str));
   return 0;
  }
  else
  {
   //if yes then
   write(fd2[1], "valid",sizeof(concat_str));
   close(fd2[1]);
   q=fork();//create chile process 2
   if(q>0)
   {
    close(fd3[0]);/*close read head offd3[] */
    write(fd3[1],concat_str,sizeof(concat_str);//write message by monitor(main process) using fd3[1]
    close(fd3[1]);
    wait(NULL);//wait till child_process_2 send ACK
    //...........................................................
    close(fd4[1]);
    read(fd4[0],concat_str,100);
    close(fd4[0]);
    if(sctcmp(concat_str,"ack")==0)
    {
     printf("Messageof child process_1 is received by child process_2");
    }
    else
    {
     printf("Messageof child process_1 is not received by child process_2");
    }
   }
   else
   {
    if(p<0)
    {
     printf("Chiile_Procrss_2 not cheated");
    }
    else
    {
      
     close(fd3[1]);//Close writing end of first pipe
     char concat_str[100];
     read(fd3[0], concal_str, strlen(concat_str)+1);
     close(fd3[0]);
     close(fd4[0]);//Close writing end of second pipe
     write(fd4[1], "ack",sizeof(concat_str));
      
    }
   }
  }
  close(fd2[1]);
}
}