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