如何从包含fork()的递归函数返回值?

时间:2018-11-26 11:27:50

标签: fork return-value

c中有一个简单的程序,可以计算int数组中的最大值。它使用fork()更快地完成此工作。实际上,它将数组减半,每个部分减半,依此类推。(类似于合并排序。)问题是调用main中的findMax函数后的行执行了多次(子进程数)。并且返回值不正确。我想我必须在其他地方使用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;
   }
}

0 个答案:

没有答案