Несколько дочерних процессов
может кто-нибудь помочь мне о том, как создать несколько дочерних процессов, имеющих один и тот же родительский элемент, чтобы выполнить "часть" определенной работы?
например, внешний алгоритм сортировки, который применяется с дочерними процессами; каждый дочерний процесс сортирует часть данных, и, наконец, родитель объединяет их.
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);
}
}
}