Невозможно получить CTR-C после изменения группы процессов

Невозможно получить CTR-C после изменения группы процессов

У меня есть такой код:

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. Но, видимо, этого не происходит.

Так что мой вопрос, что является реальным приемником сигнала в этом случае? Спасибо за совет

Связанный контент