API процесса для нескольких детей частичное добавление - PullRequest
0 голосов
/ 07 сентября 2018

Я создал программу, которая создает 3 дочерних элементов и отправляет часть массива каждому дочернему элементу, затем каждый дочерний элемент вычисляет сумму массива и печатает его с идентификатором процесса, а затем отправляет сумму родительскому элементу, который, в свою очередь, будет добавьте значения и выведите окончательную сумму. У меня вопрос: когда я запускаю свой код, я получаю случайные дочерние и родительские выходные данные после частичного суммирования и суммирования родительских элементов.

Вот мой код:

#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>

int main ()
{
  pid_t child_pid[3] ;
  //Define the array to hold the set of numbers
  int setNum[6] = {2,3,7,-1,10,6}, sum[3] = {0, 0, 0}, j;

  //Display the parents process ID
  printf("I am the parent with process ID: %d \n", (int) getppid());

  //Create a process
  for(j=0; j<3; j++)
  {
    child_pid[j] = fork();
  }
  j=0;
  if (child_pid[0] != 0)
  {
    //calculate the sum
    for(int i=0; i<2; i++)
      sum[j] = sum[j] + setNum[i];
    printf("I am the child with process ID: %d and I am sending %d to my parent\n", child_pid[0], sum[j]);
    j=j+1;
  }
  if (child_pid[1] != 0)
  {
    //calculate the sum
    for(int i=2; i<4; i++)
      sum[j] = sum[j] + setNum[i];
    printf("I am the child with process ID: %d and I am sending %d to my parent\n", child_pid[1], sum[j]);
    j=j+1;
  }
  if (child_pid[2] != 0)
  {
    //calculate the sum
    for(int i=4; i<6; i++)
      sum[j] = sum[j] + setNum[i];
    printf("I am the child with process ID: %d and I am sending %d to my parent\n", child_pid[2], sum[j]);
    j=j+1;
  }


  //Print the parent with final sum
  int final_sum = sum[0] + sum[1] +sum[2];

  printf("I am the parent with process ID: %d with a final sum of %d\n", (int) getppid(), final_sum);

  return 0;
}

1 Ответ

0 голосов
/ 07 сентября 2018

Несколько проблем.

  • Ваш первоначальный цикл fork () приведет к созданию 7 процессов-потомков, а не к 3, которые вы намереваетесь. Если fork () возвращает 0, вы находитесь в дочернем процессе и не должны использовать fork ().
  • После того, как процесс fork () по умолчанию перестал делиться памятью со своим родителем. Вам нужно либо установить биты памяти, которые вы используете для совместного использования (например, с помощью mmap с MAP_SHARED|MAP_ANONYMOUS), либо передать результаты обратно через канал или сокет или что-то еще.
  • Ваши тесты элементов child_pid против 0 обратны. Вы используете дочернюю логику в каждом процессе, кроме правильного.
  • Все ваши дочерние процессы печатают конечный текст, который должен печатать только родительский процесс.
  • Вы используете getppid (), который получает родительский PID, но ваш код указывает, что вы пытаетесь получить собственный PID процесса, что делается с помощью getpid ().
...