Умножьте числа, используя вилку и трубу - PullRequest
0 голосов
/ 04 марта 2020

Для этого назначения нам необходимо умножить два числа на несколько процессов. Первое число умножается на каждое число di git из второго числа, умножается на его позицию (1, 10, 100 и т. Д. c), а затем суммируется все эти числа. Предположительно, сумма будет собрана через канал родителя, который используется всеми дочерними процессами, но по какой-то причине мой код зависает при запуске. Также, если я не использую канал и использую закомментированную строку, она работает нормально, что не имеет смысла, так как дочерние процессы не должны иметь доступа к родительской переменной multiplicationResult.

#include <sys/wait.h>
#include <unistd.h>
#include <limits.h>

int digits (int n) {
    if (n < 0) n = (n == INT_MIN) ? INT_MAX : -n;
    if (n < 10) return 1;
    if (n < 100) return 2;
    if (n < 1000) return 3;
    if (n < 10000) return 4;
    if (n < 100000) return 5;
    if (n < 1000000) return 6;
    if (n < 10000000) return 7;
    if (n < 100000000) return 8;
    if (n < 1000000000) return 9;
    return 10;
}

int main() {
  int firstNumber = 23;
  int secondNumber = 233435;
  int secondNumberDigitsCount = digits(secondNumber);
  int parentPipe[2];

  printf("Second number's digits count = %d\n", secondNumberDigitsCount);

  pipe(parentPipe);

  int secondNumberDigitsArray[secondNumberDigitsCount];
  for (int i=0; i<secondNumberDigitsCount; i++) {
    secondNumberDigitsArray[i] = secondNumber % 10;
    secondNumber /= 10;
  }

  int multiplicationResult = 0;

  int digitPositionMultiplier = 1;
  for (int i=1; i<secondNumberDigitsCount+1; i++) {
    int secondNumberDigit = secondNumberDigitsArray[i-1];

    pid_t child = fork();
    if (child > 0) {
    printf("Child %d created\n", child);
    int digitByMultiplierByFirstNumber = digitPositionMultiplier * secondNumberDigit * firstNumber;
    printf("Digit by mulitplier %d\n", digitByMultiplierByFirstNumber);
    digitPositionMultiplier = digitPositionMultiplier * 10;
    // multiplicationResult += digitByMultiplierByFirstNumber;
    int currentMultiplicationResult;
    read(parentPipe[0], &currentMultiplicationResult, sizeof(currentMultiplicationResult));
    currentMultiplicationResult += digitByMultiplierByFirstNumber;
      return 0;
      return 0;
    write(parentPipe[1], &currentMultiplicationResult, sizeof(multiplicationResult));
    }
    else if (child == 0) {
      printf("Child terminating\n");
      return 0;
    }
  }

  while (wait(NULL) > 0);

  printf("Multiplication result %d\n", multiplicationResult);
  printf("Parent terminating\n");
  return 0;
}
```multiplicationResult 
...