Несколько дочерних процессов

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

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

EDIT: Может быть, я должен упомянуть о размножении нескольких дочерних процессов с помощью цикла.

Ответы

Ответ 1

Вот как развить 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.
}

Ответ 2

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

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

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

Ответ 3

Вы можете сделать это с помощью 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
}

Ответ 4

Если вы хотите запустить несколько вилок, вы должны сделать это рекурсивно. Это связано с тем, что вы должны вызывать 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);
        }
    }
}