Как вернуть значение из рекурсивной функции, которая включает в себя fork ()? - PullRequest
0 голосов
/ 26 ноября 2018

В c есть простая программа, которая вычисляет максимальное значение в массиве int.Он использует fork (), чтобы сделать эту работу быстрее.Фактически, он делит массив пополам, и каждая часть делится пополам и т. Д. (Что-то вроде сортировки слиянием). Проблема в том, что строки после вызова функции findMax в main выполняются много раз (количество дочерних процессов).и возвращаемое значение не является правильным.Я думаю, что я должен использовать wait () в другом месте, но я не знаю где.кто-нибудь может мне помочь? Вот код:

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
#include <sys/wait.h>
#include <time.h>

int findMax(int a[], int l, int r);

int main(){
   int n;
   int max;
   int stat;
   int i;
   int arr[100];
   printf("Enter number of numbers:\n");
   scanf("%d", &n);
   srand(time(0));
   printf("The array is:\n");
   for(i = 0; i<n; i++){
        arr[i] = rand()%128;
        printf("%d ", arr[i]);
   }
   printf("\n");
   max = findMax(arr, 0, n-1);
   wait(&stat);
   printf("the entire maximum number is: %d\n", max);
   return 0;
    }

int findMax(int a[], int l, int r){
   int blockMax;
   int i;
   if(r-l+1<10){
        blockMax = a[l];
        for(i = l+1; i<=r; i++){
           if(a[i]>blockMax)
                blockMax = a[i];
        }
        printf("maximum from number %d to %d is  %d\nPID:%d PPID:%d\n", l+1, r+1, blockMax, (int)getpid(),  (int)getppid());
        return blockMax;
   }
   else{
        int m;
        int max1, max2;
        int status;
        m = (l+r)/2;
        pid_t pid = fork();
        if(pid<0){
           printf("Fork failed.\n");
           return 0;
        }
        else if(pid == 0){
           max1 = findMax(a, l,m);
        }
    else{
       max2 = findMax(a, m+1, r);
    }
    wait(&status);
    if(max1 > max2)
       return max1;
    else
       return max2;
   }
}
...