我必须在包含10个子进程的1000个数字的数组中找到最大值(因此每个进程只检查一百个值),并且父进程只需要收集数据。 我已经完成了所有事情,但我仍然坚持阅读这些价值观。
以下是代码:
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
int main(){
int array[1000];
int i, j;
int pids[10];
int searchminindex;
int searchmaxindex;
int maxindex;
srand(time(NULL));
//fill up array with random numbers
for(i = 0; i < 1000; i++)
{
tomb[i] = random() % 5000;
}
//create 10 child processes
for (i = 0; i < 10; i++) {
if ((pids[i] = fork()) < 0) {
perror("fork");
abort();
}
else if (pids[i] == 0) {
searchminindex = i * 100;
searchmaxindex = (i+1) * 100;
//finding the biggest value
maxindex = searchminindex;
for(j = searchminindex+1; j < maxindex; j++) {
if( array[maxindex] < array[j])
maxindex = j;
}
}
}
for(i = 0; i < 10; i++){
//here's where I'd read the return values of the subarrays
}
return 0;
}
我尝试过使用烟斗并使用WEXITSTATUS,但我真的很困惑,并且不知道在哪里关闭管道的一端以及类似的东西,以及WEXITSTATUS I&#39 ; m完全迷失了。
你能以任何方式提供帮助吗?
答案 0 :(得分:0)
你需要测试从fork返回的pid,并对你的代码进行分支,这样你的主进程就不会像孩子一样,所以你的孩子不会产生自己的孩子。一旦得到照顾......
分叉进程之间共享内存的解释here
我会使用mmap
在进程之间创建共享内存,您需要为每个进程指定放置结果的位置,然后使用wait
确定所有子进程何时退出,以及一个好的程序会评估退出状态,并告知用户是否有任何孩子异常退出。
不要忘记在父出口之前清理共享内存。
答案 1 :(得分:0)
你需要测试从fork返回的pid,并对你的代码进行分支,这样你的主进程就不会像孩子一样,所以你的孩子不会产生自己的孩子。一旦得到照顾......
mmap或设置共享内存的替代方法是使用WEXITSTATUS。根据手册页,它只会返回最低8位,所以如果你的返回值可能大于127,这可能不是你最好的选择。最多可以工作255,但要注意char的签名,这不是标准。
int returned_values[10];
for(int i = 0; i < 10; ++i)
{
int status;
wait(&status);
if(WIFEXITED(status))
returned_values[i] = WEXITSTATUS(status);
else {
//Do something more meaningful here
//This means a child received a signal, or any of the other ways wait returns other than a child exiting.
--i;
}