Разветвленные 10 дочерних процессов, как родительский процесс может собирать свои возвращаемые значения?
Я должен найти самое большое значение в массиве из 1000 чисел с 10 дочерними процессами (чтобы каждый из них проверял только сто значений), а родитель должен был только собрать данные. Я уже закончил со всем этим, но я застрял в чтении значений.
Вот код:
#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 я полностью потерян.
В любом случае вы могли бы помочь?
2 ответа
Вам нужно протестировать pid, возвращенный из fork, и разветвлять свой код, чтобы ваш основной процесс не действовал как ребенок, и чтобы ваши дети не порождали своих собственных детей. Как только об этом позаботятся...
Разделение памяти между разветвленными процессами хорошо объяснено здесь
я хотел бы использовать mmap
чтобы создать общую память между процессами, вам нужно будет указать для каждого процесса, куда поместить его результат, а затем использовать wait
определить, когда все дети вышли, и хорошая программа оценит состояние выхода и сообщит пользователю, если какой-либо ребенок вышел ненормально.
Не забудьте очистить разделяемую память перед выходом из родительского режима.
Вам нужно протестировать pid, возвращенный из fork, и разветвлять свой код, чтобы ваш основной процесс не действовал как ребенок, и чтобы ваши дети не порождали своих собственных детей. Как только об этом позаботятся...
Альтернативой 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;
}