Создайте мультипроцесс с указанным количеством дочерних элементов с помощью fork () - PullRequest
0 голосов
/ 04 мая 2018

Я хотел бы создать программу, которая имеет несколько чисел на входе, и каждое число (разделенное пробелом) должно обрабатываться в 4 различных процессах, чтобы увидеть, является ли это простое число. В этом случае необходимо добавить счетчик (поэтому я думаю, что у ребенка должна быть общая память).

Как только мой процесс завершается с одним номером, он получает другой, который не обрабатывается другим процессом. Идея в том, чтобы они работали почти параллельно.

Я собираюсь отделить строку от токенов и отправить ее дочернему процессу.

Вот что я сделал до сих пор:

unsigned int i = 0;
int processes = 4;
char *s=malloc(sizeof(char)*100);

fgets (s, 100, stdin);

for (i = 0; i < processes; ++i) {
    if (fork() == 0) {
        printf("Process %d:", i);
        make_token(s);
        treat_number(token);
        exit(0);
    }
}
// wait all child processes
int status;
for (i = 0; i < processes; ++i)
wait(&status);

return 0;

Но после этого моя программа заканчивается после завершения процесса 4, и они не работают точно параллельно.

Так как я могу заставить его обрабатывать несколько чисел в 4 процессах почти одновременно, каждый из которых получает разные числа, пока не закончится моя строка?

Пример ввода / вывода будет:

Input: 0 10 100000000 100007701 100015739 3 5
Output: 4

1 Ответ

0 голосов
/ 05 мая 2018

Не самый эффективный способ, но у вас как минимум отпадает необходимость общения с детьми:

  • Сделайте так, чтобы все процессы знали все числа, возможно, просто сообщив им полный ввод, как и код уже делает.
  • Сделайте так, чтобы каждый процесс знал, какой это ребенок. В настоящее время выполняется значение i.
  • Пусть каждый процесс позаботится о number-of-processes th числе из входа.

    Если предположить 4 процесса, то для i == 3 это будет 3-е, 7-е, 11-е ... число от входа, для i == 1 это будет 1-й, 5-й, 9-й, ...

...