Вы можете использовать команду kill
для отправки сигнала на указанный номер процесса:
kill -2 12345
Конечно, полезно, если ваш код определяет, какой PID убить (ребенок должен сообщить свой PIDкогда начинается зацикливание).Но с простыми изменениями (например, без использования неиспользуемой функции ignoreInt () и сообщением PID дочернего процесса) все работало нормально, как было написано - и команда kill работала над этим тоже.
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <signal.h>
static void catchInt(int signum)
{
printf("\nMy sincerest apologies, master (%d)\n", signum);
exit(0);
}
static void catchAlarm(int signum)
{
printf("It's great to be alive (%d)\n", signum);
signal(SIGALRM, catchAlarm);
alarm(3);
}
int main(void)
{
pid_t pid = fork();
if (pid < 0)
{
fprintf(stderr, "Fork Failed");
exit(-1);
}
else if (pid == 0)
{
printf("It's great to be alive (%d)\n", (int)getpid());
signal(SIGINT, catchInt);
signal(SIGALRM, catchAlarm);
alarm(3);
for ( ;; )
{
printf("I have 42001 children and not one comes to visit\n");
usleep(500000);
}
}
return(0);
}
Если вы собираетесь включить <sys/types.h>
, он обычно должен быть первым из заголовков POSIX (и, следовательно, до <unistd.h>
).Тот факт, что он указан последним, говорит о том, что он вам вообще не нужен, но я, кажется, помню предыдущий вопрос, в котором вы утверждали, что это было необходимо.(OTOH, нет вызова ни одному из семейства wait()
, поэтому <sys/wait.h>
не требуется, и я умеренно убежден, что <sys/types.h>
не требуется в большинстве современных систем.)