Как создать определенное количество дочерних процессов с помощью fork () - PullRequest
4 голосов
/ 16 февраля 2011

Мне нужно создать определенное количество параллельных дочерних процессов. Я также хочу, чтобы каждый дочерний процесс изменял глобальную переменную, чтобы основной родительский процесс мог печатать ее в последней измененной версии. Когда я запускаю программу ниже, конечное значение для 'k' будет 5, поэтому глобальная переменная не меняется. Если я уберу часть «exit (0)», глобальная переменная изменится, но на этот раз число созданных дочерних процессов станет больше.

Используя fork (), как мне создать X число дочерних процессов, которые могут изменять данные (глобальные переменные, локальные переменные и т. Д.) В главном родительском процессе?

int k = 5; // global variable   

int main(){

  int i=0;
  int status;

  for(i = 0; i<5; i++){
    if(fork() == 0){ 
        printf("child %d %d\n", i, ++k);
        sleep(5);
        printf("done %d\n",i);
        exit(0);
    }
  }

  return 0;
}

Ответы [ 5 ]

2 голосов
/ 16 февраля 2011

Как прокомментировал Кевин, вам действительно нужны потоки.Делать IPC для этого - излишне.Посмотрите на следующую ссылку.

http://www.yolinux.com/TUTORIALS/LinuxTutorialPosixThreads.html

2 голосов
/ 16 февраля 2011

Вы не можете сделать это таким образом.Fork создаст новый процесс, который будет копировать (или копировать при записи) страницы памяти в новый процесс.Это означает, что каждый из ваших дочерних процессов получит свою собственную копию «k», а каждая копия «k» будет увеличена только один раз.

Чтобы все процессы связывались с «одним и тем же» kпеременная, вам нужно выполнить какое-то межпроцессное взаимодействие.

Примеры хороших межпроцессных взаимодействий:

  1. Пусть родительский процесс создает сегмент общей памяти, в котором хранится значение k.Пусть дочерние процессы ждут эксклюзивного захвата сегмента общей памяти (через созданный родительским процессом мьютекс).Когда дочерний элемент имеет эксклюзивную блокировку, пусть дочерний элемент прочитал значение k и сохранил значение k + 1.

  2. Создайте канал для процесса между родительским и дочерним процессами.Пусть родитель прочитает канал для сообщения, указывающего на желание увеличить k.Затем попросите родительский процесс увеличить k от имени ребенка.

Примеры плохой связи между процессами:

  1. Любое решение, которое не обеспечивает изменения вK являются атомарными (это означает, что два конкурирующих потомка могут оба увеличить K до одного и того же значения).Такое отсутствие внимания приведет к тому, что значение K будет увеличиваться меньше, чем число дочерних процессов, так как установленные значения могут выглядеть (2, 3, 3, 4, 5).Это означает, что файловый ввод-вывод в основном бесполезен, если только вы не создадите вокруг него структуру, которая обеспечивает атомарные операции при блокировке файла для монопольного доступа.
1 голос
/ 16 февраля 2011

Процессы по определению не могут напрямую изменять ресурсы других процессов (таких как глобальные переменные и т. Д.).Вы хотите использовать потоки, а не процессы для этого.Посмотрите в pthread_create (3) или клон (2)

1 голос
/ 16 февраля 2011

Дочерние процессы не могут по умолчанию изменить что-либо в адресном пространстве родителя. Для этого вам нужна общая память, а также мьютексный механизм, предотвращающий состояние гонки.

0 голосов
/ 16 февраля 2011

Дочерний процесс получает копию адресного пространства родителей. Другими словами, каждый дочерний процесс имеет свою собственную копию глобальных переменных.

Вам необходимо поместить вашу переменную в отображение общей памяти, чтобы все дочерние процессы и родительский процесс имели общую переменную.

...