Моя программа должна создать n дочерних элементов. Когда сигнал получен, создается дочерний элемент. Затем первый ребенок ждет остальных n-1 детей. Второй ждет других n-2-детей и так далее, пока последний ребенок не запустится и не завершится немедленно. Я пишу этот код, но он не работает, и я получаю племянников.C: Ожидание завершения процесса брака
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <signal.h>
#include <sys/wait.h>
void func(int sign)
{
printf("received signal. I create a child\n");
}
int main(int argc, char*argv[])
{
if(argc!=3)
{
printf("error\n");
return 0;
}
int i,pid,status;
int n=atoi(argv[1]);
unsigned int m=(unsigned int)atoi(argv[2]);
signal(SIGALRM,func);
printf("i'm father: pid %d\n",getpid());
for(i=0; i<n; i++)
{
alarm(m);
pause();
switch(pid=fork())
{
case -1:
printf("error\n");
break;
case 0:
printf("i'm the hild numer %d, my pid is %d\n",i,getpid());
if(i!=n-1)
{
wait(NULL);
break;
}
else
{
printf("%d i have fnished\n",getpid());
exit(0);
}
break;
default:
wait(NULL);
break;
}
}
printf("finish\n");
return 0;
}
Правильный термин назвать это 'ребенок process' –
Вы будете нуждаться в какой-то способ, чтобы передать все идентификаторы детей для всех детей. В противном случае у второго ребенка не будет возможности ждать всех детей, которые еще не созданы ... – twalberg
Все дочерние процессы запускаются процессом отца. Функция wait() ожидает только детей * текущего * процесса. Код, выполняемый последним созданным ребенком, завершится, (ни один из остальных детей не завершится), в результате чего отец прекратит работу (все остальные дети все еще удерживают «ожидание» (NULL) »). I.E. все дети нуждаются в некоторой логике, чтобы заставить их прекратить работу. Один из способов - это общая переменная, которую отец инициализирует, чтобы дети продолжали выполнять, а затем после того, как все дети сгенерированы, сбросьте переменную, чтобы дети закончили. – user3629249