У меня есть такой код:
static void signal_handler(int signum);
int main(void)
{
const struct sigaction sa = {
.sa_handler = signal_handler,
};
sigaction(SIGINT, &sa, NULL);
setpgid(0, 0);
printf("[LEADER]: PID: %d, PARENT: %d, PROCESS GROUP: %d\n",
getpid(), getppid(), getpgrp());
for (;;) {
printf("test\n");
sleep(3);
}
return 0;
}
static void signal_handler(int signum)
{
switch (signum) {
case SIGINT:
#define msg "INT received, exiting...\n"
write(STDOUT_FILENO, msg, sizeof(msg));
#undef msg
exit(EXIT_FAILURE);
}
}
После изменения группы процессов
setpgid(0, 0);
Я больше не мог получать CTRL-C (SIGINT) с терминала. Я использую утилиту make для запуска этого приложения.
Если я запускаю процесс вручную (без правила 'make run'), сигналы приходят успешно. Я много читал в Интернете, например:
Сигнал SIGINT генерируется дисциплиной линии терминала и транслируется всем процессам в группе процессов переднего плана терминала.
Согласно этому утверждению, почему, если в терминале процесс переднего плана является приложением, оно не может получить прерывание CTRL-C? Группа процесса отличается между make и приложением:
USER PID PPID PGID SESS JOBC STAT TT TIME COMMAND
vitto 1662 1661 1662 0 1 S s000 0:00.16 -zsh
vitto 3956 1662 3956 0 1 S+ s000 0:00.01 make run
vitto 3969 3956 3969 0 1 S s000 0:00.00 bin/application
но в то время, когда я нажимаю CTRL-C, я смотрю на bin/application
, а не на make
. Так что он должен послать сигнал bin/application
группе процессов 's. Но, видимо, этого не происходит.
Так что мой вопрос, что является реальным приемником сигнала в этом случае? Спасибо за совет