Não é possível receber CTR-C após alterar o grupo de processos

Não é possível receber CTR-C após alterar o grupo de processos

Eu tenho este código:

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);
    }
}

Depois de alterar o grupo de processos

setpgid(0, 0);

Não consegui mais receber CTRL-C (SIGINT) do terminal. Estou usando o utilitário make para executar este aplicativo.

Se eu executar o processo manualmente (sem a regra 'make run'), os sinais chegarão com sucesso. Eu tenho vermelho muito na web como:

O sinal SIGINT é gerado pela disciplina de linha terminal e transmitido para todos os processos no grupo de processos de primeiro plano do terminal.

De acordo com esta afirmação, por que se no terminal o processo em primeiro plano é a aplicação, ele não pode receber a interrupção CTRL-C? O grupo de processos é diferente entre a marca e a aplicação:

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

mas na hora que pressiono CTRL-C estou procurando o bin/application, e não o make. Portanto, ele deve enviar o sinal para o bin/applicationgrupo de processos do. Mas aparentemente isso não acontece.

Então minha pergunta é qual é o verdadeiro receptor do sinal neste caso? Obrigado em conselhos

informação relacionada