fork (), Создание процессов pipe () и exec () и обмен данными

Мне нужно написать программу, которая создает процесс с помощью pipe () .

Моя первая задача - написать родительский процесс, который генерирует четыре дочерних процесса. с помощью функции fork () .

Как только fork () завершится успешно, замените дочерний процесс другим процессом rover1, rover2, rover3 и rover4 , хотя все они имеют одинаковый код.

] Функция процессов заключается в следующем.

  1. Каждому дочернему процессу изначально присваивается собственный номер. Он получает новый номер от родителя. Используя следующую формулу, он создает свой собственный новый номер следующим образом и перенаправляет его родительскому элементу:

    mynumber = (3 * mynumber + 4 * numberreceived) / 7

  2. Этот процесс продолжается до тех пор, пока родительский элемент не отправит сообщение о том, что система стабильно. Родитель также имеет свой начальный номер. Он получает номера всех дочерних элементов и вычисляет свое новое число следующим образом:

    mynumber = (3 * mynumber + числа, отправленные всеми дочерними элементами ) / 7

  3. Родитель отправит это число в все его дети. Этот процесс будет продолжаться до тех пор, пока родитель не обнаружит, что его номер больше не меняется. В это время он сообщит детям, что система стала стабильной.

Это то, что я сделал, но мой профессор сказал, что я должен использовать exec () для выполнения дочернего процесса и замены дочернего процесса другим дочерним процессом. Я не уверен, как использовать exec (). Не могли бы вы помочь мне с этим.

Я прикрепляю только первое дочернее поколение.

// 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], &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], &mynumber1, sizeof(int));    
    }       
  }
  /* Error:
   * If fork() returns a negative number, an error happened;
   * output error message
   */
  if (rover1 < 0) {
    fprintf(stderr,
            "can't fork, child process 1 not created, error %d\n",
            errno);
    exit(EXIT_FAILURE);
  }
}
5
задан Adam Liss 14 June 2013 в 14:28
поделиться