Что не так с моей многопроцессорной программой?
Я делаю программу с целью создания процесса в рамках процесса 3 раза (получить дочерний процесс (1), гранд дочерний процесс (2) и гранд внучатый процесс (3)) и выполнять действия в каждом процессе в обратном порядке порядка создания. Это означает, что сначала я выполняю действия (3), затем действия (2), затем (1), а затем родительского процесса. Но вывод странный, как выполнение 6 printfs и нескольких процессов, говорящих, что у них одинаковый pid.
Код:
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
int main(void)
{
pid_t mypid = getpid();
pid_t child1_pid=fork();
pid_t child2_pid=-1; //waiting for child1 to fork
pid_t child3_pid=-1; //waiting for child2 to fork
int status;
if(child1_pid==0)
{
mypid=getpid();
child2_pid=fork()
if(child2_pid==0)
{
mypid=getpid();
child3_pid=fork()
if(child3_pid==0)
{
mypid=getpid();
printf("3: Im %ld and my parent is %ld\n", mypid, getppid());
}
wait(&status);
printf("2:Im %ld and my parent is %ld\n", mypid, getppid());
}
wait(&status);
printf("1:Im %ld and my parent is %ld\n", mypid, getppid());
}
else
{
wait(&status);
printf("\nIm the father and my pid is %ld\n", mypid);
}
return 0;
}
Я спрашиваю о том, что я делаю неправильно, и где моя логика неверна, и, возможно, укажет мне на чтение в Интернете. Заранее спасибо.
2 ответа
if(child1_pid==0)
{
mypid=getpid();
child2_pid=fork()
if(child2_pid==0)
{
mypid=getpid();
child3_pid=fork()
if(child3_pid==0)
{
mypid=getpid();
printf("3: Im %ld and my parent is %ld\n", mypid, getppid());
}
wait(&status);
printf("2:Im %ld and my parent is %ld\n", mypid, getppid());
}
wait(&status);
printf("1:Im %ld and my parent is %ld\n", mypid, getppid());
}
В этом коде великий внук напечатает 3 раза: printf внутри его if и внешние 2.
Внучка напечатает свой printf, его внешний и так далее.
Ваши новые процессы продолжают нормально выполнять остальную часть вашего кода, что означает, что он напечатает следующие printf, которые существуют в коде.
Чтобы код выполнялся по вашему желанию, вы должны прекратить выполнение в каждом дочернем процессе, а каждый родительский процесс должен дождаться завершения дочернего процесса перед печатью.
Следующее должно работать по вашему желанию.
if(child1_pid==0)
{
mypid=getpid();
child2_pid=fork()
if(child2_pid==0)
{
mypid=getpid();
child3_pid=fork()
if(child3_pid==0)
{
mypid=getpid();
printf("3: Im %ld and my parent is %ld\n", mypid, getppid());
return 0;
}
waitpid(child3_pid,&status,0);
printf("2:Im %ld and my parent is %ld\n", mypid, getppid());
return 0;
}
waitpid(child2_pid,&status,0);
printf("1:Im %ld and my parent is %ld\n", mypid, getppid());
}else
{
waitpid(child1_pid,&status,0);
printf("\nIm the father and my pid is %ld\n", mypid);
}
return 0;
Функция waitpid ожидает завершения указанного процесса pid. Объявления функций следующие:
pid_t waitpid(pid_t pid, int *status,int options);
Значение 0 для параметра options, использованного в показанном ранее коде, указывает на то, что он должен работать по умолчанию (дождаться завершения процесса).
Добавляя к ответу DMH, вы должны также использовать write() вместо printf, так как printf буферизирует выходные данные, поэтому результаты могут быть смешаны в конце выходных данных.
http://www.csl.mtu.edu/cs4411.ck/www/NOTES/process/fork/create.html