title: 2 way comm using pipes in C linux
body: <p>I want parent and child processes to communicate in C linux using pipes. First I want parent to pass a string and then child to acknowledge it. I have created two file descriptors. one for parent to child i.e. readpipe and other writepipe for viceversa. The problem is its not taking my data as input. Also I want the printf statements such as "Enter your data" to be printed once but since after fork, there are two processes so they are being displayed twice. Any alternative to that??</p>
  
  <pre><code> //readpipe[0] = child read
   //readpipe[1]= parent write
  
  //writepipe[0]=parent read
  //writepipe[1]=child write
  
   #include &lt;stdio.h&gt;
   #include &lt;stdlib.h&gt;
   #include &lt;sys/types.h&gt;
   #include &lt;unistd.h&gt;
   #include &lt;string.h&gt;
  
   int main(void)
   {
        pid_t pid;
        int r;
        /* Hope this is big enough. */
       char buf[1024];
       char cp[50];
       char ans;
       int readpipe[2];
       int writepipe[2];
       int a;
       int b;
       a=pipe(readpipe);
       b=pipe(writepipe);
       if (a == -1) { perror("pipe"); exit(EXIT_FAILURE); }
       if (b == -1) { perror("pipe"); exit(EXIT_FAILURE); }
  
       printf("\nSEND SOMETHING TO CHILD PROCESS\t");
       scanf(" %c",&amp;ans);
       pid=fork();
       if(pid==-1)
       {
           printf("pid:main");
           exit(1);
       }
  
       while(ans=='y' || ans=='Y')
       {
          printf("\nEnter data\t"); //printed twice
          fgets(cp, 50, stdin);     //not taking data
          printf("\n%s",cp);        
          if(pid==0)
          { //CHILD PROCESS
           close(readpipe[1]);
           close(writepipe[0]);
           read(readpipe[0],buf,sizeof(buf));
           printf("\nSENT\n %s",buf);
           write(writepipe[1],cp,strlen(cp)+1);
         }
        else
        { //PARENT PROCESS
          close(readpipe[0]);
          close(writepipe[1]);
          write(readpipe[1],cp,strlen(cp)+1);
          read(writepipe[0],buf,sizeof(buf));
          printf("\nRECEIVED\n %s",buf);
       }
       printf("\nSEND SOMETHING TO CHILD PROCESS\t");
       scanf(" %c",&amp;ans);
    }
    close(readpipe[1]);
    close(writepipe[0]);
    close(readpipe[0]);
    close(writepipe[1]);
  
     return 0;
  }
  </code></pre>