(Отредактировано: исправлены некоторые вещи, основанные на ваших комментариях, но все еще не нужные мне результаты - некоторые процессы становятся осиротевшими и получают родительский init (pid 1), это потому, что цикл завершения находится внутри другого цикла? Как еще я могу активировать и завершить на той же петле, что я раздвоил?)
В следующем коде мне нужно напечатать pid, созданный с помощью fork()
в цикле в сообщении, когда сигнал отправляется процессу, но я получаю значение по умолчанию для всех pid (0). Домашнее задание включало отправку сигналов дочерним процессам в соответствии с рядом аргументов, т.е. ./a.out 1 3 5 4 2
должен будет отправлять сигналы дочерним процессам 1 3 5 4 2
в этом порядке и печатать их pid также в этом порядке.
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
#include <signal.h>
/*SIGCHLD, SIGCONT*/
int status;
static int alarmOn = 0;
int main(int argc, char **argv)
{
pid_t pid[5], f;
void activateChild(int signal)
{
alarmOn = 1;
}
(void) signal(SIGCONT,activateChild);
for(int i = 0; i < 5; i++)
{
f = fork();
if (f < 0 )
{
printf("\nfork failed\n");
}
if (f == 0)
{
printf("\nprocess %d, %d is paused\n",i,getpid());
pause();
}
if (f > 0)
{
pid[i]=f;
kill(pid[atoi(argv[i])],SIGCONT);
if(alarmOn)
{
printf("\nchild %s pid: %d is executed %d\n ",argv[i+1],pid[atoi(argv[i+1])],i);
sleep(3);
}
kill(pid[atoi(argv[i+1])],SIGCHLD);
}
}
exit(0);
return(0);
}