首页 > 解决方案 > 如何从包含 fork() 的递归函数返回值?

问题描述

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;
   }
}

标签: forkreturn-value

解决方案


推荐阅读