Множественный дочерний процесс
Может ли кто-нибудь помочь мне с тем, как создать несколько дочерних процессов, имеющих одного и того же родителя, для выполнения "некоторой" части определенной работы?
например, алгоритм внешней сортировки, который применяется с дочерними процессами; каждый дочерний процесс сортирует часть данных и, наконец, родительский процесс объединяет их..
РЕДАКТИРОВАТЬ: Может быть, я должен упомянуть о разветвлении нескольких дочерних процессов с циклом..
5 ответов
Вот как раскошелиться на 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.
}
Если вы хотите запустить несколько вилок, вы должны сделать это рекурсивно. Это потому, что вы должны вызвать 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);
}
}
}
Я думаю, что стоило бы указать, почему темы здесь более уместны:
Поскольку вы пытаетесь выполнить "часть" работы параллельно, я предполагаю, что ваша программа должна знать о результате вычислений. fork() процесса не разделяют больше начальной информации после fork(). Каждое изменение в одном процессе неизвестно другому, и вам нужно будет передать информацию в виде сообщения (например, через канал, см. "Man pipe"). Потоки в процессе разделяют одно и то же адресное пространство и поэтому могут манипулировать данными и иметь их видимыми для любого другого "немедленно". Кроме того, добавив преимущества более легкого веса, я бы пошел с pthreads().
В конце концов: вы узнаете все, что вам нужно знать о fork (), если вы все равно используете pthreads.
Вы можете сделать это с вилкой. Данный родитель может разветвляться столько раз, сколько захочет. Тем не менее, я согласен с 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
}
#include<stdio.h>
#include<unistd.h>
#include <stdlib.h>
int main() {
int n = 3; //How many child process to create from 1 parent?
printf("parent process running, pid of the parent process is
%d\n",getpid());
for(int i=0; i<n; i++) {
pid_t return_value;
return_value = fork();
if(return_value <0){
printf("fork() has failed during child creation");
exit(1);
}
else if(return_value == 0){
printf("Child created successfully,at the instance child process is running on CPU, pid of the child process is %d\n", getpid());
exit(0);
}
}
for(int i=0; i<n; i++){
//Parent process waits for child process to finish execution
int status;
wait(&status);
}
printf("parent process running again after creation of 3 child, pid of the parent process is %d\n", getpid());
return 0;
}
/*>Output
parent process running, pid of the parent process is 732
Child created, pid of the child process is 736
Child created, pid of the child process is 738
Child created, pid of the child process is 737
*/