Множественный дочерний процесс - PullRequest
13 голосов
/ 18 мая 2009

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

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

РЕДАКТИРОВАТЬ: Может быть, я должен упомянуть о разветвлении нескольких дочерних процессов с циклом ..

Ответы [ 4 ]

45 голосов
/ 18 мая 2009

Вот как раскошелиться на 10 детей и дождаться их окончания:

pid_t pids[10];
int i;
int n = 10;

/* Start children. */
for (i = 0; i < n; ++i) {
  if ((pids[i] = fork()) < 0) {
    perror("fork");
    abort();
  } else if (pids[i] == 0) {
    DoWorkInChild();
    exit(0);
  }
}

/* Wait for children to exit. */
int status;
pid_t pid;
while (n > 0) {
  pid = wait(&status);
  printf("Child with PID %ld exited with status 0x%x.\n", (long)pid, status);
  --n;  // TODO(pts): Remove pid from the pids array.
}
5 голосов
/ 18 мая 2009

Думаю, стоит указать, почему темы здесь более уместны:

Поскольку вы пытаетесь выполнить «часть» работы параллельно, я предполагаю, что ваша программа должна знать о результате вычислений. fork () процесса не разделяют больше начальной информации после fork (). Каждое изменение в одном процессе неизвестно другому, и вам нужно будет передать информацию в виде сообщения (например, через канал, см. «Канал пользователя»). Потоки в процессе разделяют одно и то же адресное пространство и поэтому могут манипулировать данными и иметь их видимыми для любого другого «немедленно». Кроме того, добавив преимущества более легкого веса, я бы добавил pthreads ().

В конце концов: вы узнаете все, что вам нужно знать о fork (), если вы все равно будете использовать pthreads.

4 голосов
/ 13 октября 2016

Если вы хотите запустить несколько вилок, вы должны сделать это рекурсивно. Это потому, что вы должны вызвать fork из родительского процесса. В противном случае, если вы запустите второй ответвление, вы дублируете как родительский, так и первый дочерний процессы. Вот пример:

void forker(int nprocesses)
{
    pid_t pid;

    if(nprocesses > 0)
    {
        if ((pid = fork()) < 0)
        {
            perror("fork");
        }
        else if (pid == 0)
        {
            //Child stuff here
            printf("Child %d end\n", nprocesses);
        }
        else if(pid > 0)
        {
            //parent
            forker(nprocesses - 1);
        }
    }
}
3 голосов
/ 18 мая 2009

Вы можете сделать это с помощью fork . Данный родитель может разветвляться столько раз, сколько захочет. Тем не менее, я согласен с AviD pthreads может быть более подходящим.

pid_t firstChild, secondChild;
firstChild = fork();
if(firstChild > 0)
{
  // In parent
  secondChild = fork();
  if(secondChild > 0)
  {
    // In parent
  }
  else if(secondChild < 0)
  {
    // Error
  }
  else
  {
    // In secondChild
  }
}
else if(firstChild < 0 )
{
  // Error
} 
else
{
  // In firstChild
}
...