title: fork(), pipe() and exec() process creation and communication
body: <p>I have to write program that create process using <code>pipe()</code>.</p>
  
  <p>My first task is to write a parent process that generates four child processes using the <code>fork()</code> function.  </p>
  
  <p>Once the <code>fork()</code> is successful, replace the child process with another process <code>rover1, rover2, rover3, and rover4</code>, though all of them have the same code.</p>
  
  <p>The function of the processes is as follows. </p>
  
  <ol>
  <li><p>Each child process is initially given its own number.  It receives a new number from the parent.  Using the following formula it creates its own new number as follows and forwards it to the parent:</p>
  
  <p><code>mynumber = (3 * mynumber + 4 * numberreceived)/7</code></p></li>
  <li><p>This process continues until the parent sends the message that the system is stable. The parent also has its initial number.  It receives numbers of all the children and computes its new number as follows: </p>
  
  <p><code>mynumber = (3 * mynumber + <em>numbers sent by all the children</em>)/7</code></p></li>
  <li><p>The parent will send this number to all its children.  This process will continue until the parent finds that its number is not changing anymore.  At that time it will tell the children the system has become stable.</p></li>
  </ol>
  
  <p>This is what I did but my professor said I have to use exec() to execute the child and replace child process with another child process. I am not sure how to use exec(). Could you please help me with this. </p>
  
  <p>I am attaching only first child generation.</p>
  
  <pre><code>// I included stdio.h, unistd.h stdlib.h and errno.h 
  int main(void)
  {
    // Values returned from the four fork() calls
    pid_t rover1, rover2, rover3, rover4;
  
    int parentnumber, mynumber1, mynumber2, mynumber3, mynumber4;
  
    int childownnumber1 = 0, status = 1, childownnumber2 = 0,
        childownnumber3 = 0, childownnumber4 = 0, numberreceived = 0;
  
    printf("Enter parent number: ");
    printf("%d", parentnumber);
    printf("Enter each children number");
    printf("%d %d %d %d", mynumber1, mynumber2, mynumber3, mynumber4);
  
    // Create pipes for communication between child and parent
    int p1[2], p2[2];
    // Attempt to open pipe
    if (pipe(p1) == -1) {
      perror("pipe call error");
      exit(1);
    }
    // Attempt to open pipe
    if (pipe(p2) == -1) {
      perror("pipe call error");
      exit(1);
    }
  
    // Parent process generates 4 child processes
    rover1 = fork();
  
    // if fork() returns 0, we're in the child process;
    // call exec() for each child to replace itself with another process
    if (rover1 == 0) {
      for(; numberreceived != 1; ) {  
        close(p1[1]); // Close write end of pipe
        close(p2[0]); // Close read end of second pipe
  
        // Read parent's number from pipe
        read(p1[0], &amp;numberreceived, sizeof(int));
  
        if (numberreceived == 1) {
          // System stable, end child process
          close(p1[0]);
          close(p2[1]);
          _exit(0); // End child process
        }
  
        mynumber1 = (int)((3*mynumber1 + 4*numberreceived)/7.0);
  
        printf("\nrover1 number: ");
        printf("%i", mynumber1);
  
        // Write to pipe
        write(p2[1], &amp;mynumber1, sizeof(int));    
      }       
    }
    /* Error:
     * If fork() returns a negative number, an error happened;
     * output error message
     */
    if (rover1 &lt; 0) {
      fprintf(stderr,
              "can't fork, child process 1 not created, error %d\n",
              errno);
      exit(EXIT_FAILURE);
    }
  }
  </code></pre>