Для этого назначения нам необходимо умножить два числа на несколько процессов. Первое число умножается на каждое число 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], ¤tMultiplicationResult, sizeof(currentMultiplicationResult));
currentMultiplicationResult += digitByMultiplierByFirstNumber;
return 0;
return 0;
write(parentPipe[1], ¤tMultiplicationResult, 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