параллельная работа программы с использованием fork () - PullRequest
0 голосов
/ 01 сентября 2018

Я пытаюсь завершить учебник по запуску параллельной программы на C с использованием команд fork () и execl.

Пользователь вводит количество входов (N). Следующие N строк содержат число <= 10 цифр. Моя программа рассчитает число простых факторов для каждой цифры. </p>

Я пытаюсь сделать параллельное выполнение строк, используя fork и execl.

Parallel.c

int main() {
    int userInput, childPid, childResult, number;
    //Since largest number is 10 digits, a 12 characters string is more
    //than enough
    char cStringExample[12];

    scanf("%d", &userInput);

    for (int i = 0; i < userInput; i++) {
        scanf("%d",&number);
        childPid = fork();
        if (childPid == 0) {
            sprintf(cStringExample,"%d",number);
            execl("./PF","PF",cStringExample,NULL);
        }
    }

    while (wait(&childResult) != -1) {
         printf("%d has %d prime factors\n",number,childResult >> 8);
     }
}

PrimeFactorization.c

int main( int argc, char* argv[]) {


 int nFactor = 0, userInput, factor;

    //Convert string to number
    userInput = atoi( argv[1] ); 

    nFactor = 0;
    factor = 2;

    //quick hack to get the number of prime factors
    // only for positive integer
    while (userInput > 1){
        if (userInput % factor == 0){
            userInput /= factor;
            nFactor++;
        } else {
            factor++;
        }
    }
   // printf("%d has %d prime factors\n",userInput,nFactor);
    return nFactor;
}

Я хочу иметь возможность печатать для каждого процесса forked () число, которое было введено в программу Prime Factorisation, а также число основных факторов для нее. Например, если я введу

5
44721359
99999989
9
111113111
118689518

вывод

118689518 has 2 prime factors
118689518 has 3 prime factors
118689518 has 1 prime factors
118689518 has 1 prime factors
118689518 has 1 prime factors

Основные факторы верны только потому, что они не соответствуют введенному числу. Как я могу это сделать? Я попытался вставить команду ожидания в цикл for, но я не думаю, что это приводит к параллелизму. Я понимаю, почему это дает мне вывод, но я не могу придумать решение для этого.

...