fork - 如何从包含 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;
}
}
解决方案
推荐阅读
- spring-boot - HTTPOnly Cookie 中的 Spring Boot + Angular 9 JWT 令牌存储
- javascript - 将接口更改为对象类型
- python - 无法从 Flask 连接到 Postgres Docker 容器
- python - 在 PyQt 应用程序中嵌入 aiohttp 服务器
- java - 获取 SQLException:ResultSet 关闭后不允许操作
- c++ - 无法从字符串转换为模板 C2664
- facebook - 无法在开发中测试 Facebook OAuth,因为“有效 OAuth 重定向 URI”不允许 localhost
- python - 仅当标题栏未在 QDockWidget 中浮动时如何删除它
- postgresql - Hassura 容器未连接到在 localhost 上运行的 postgres
- javascript - 在计算最大值和最小值Javascript时得到错误的值