Разветвленные 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;
    }
Другие вопросы по тегам