No se puede recibir CTR-C después de cambiar el grupo de procesos

No se puede recibir CTR-C después de cambiar el grupo de procesos

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

Después de cambiar el grupo de procesos

setpgid(0, 0);

Ya no pude recibir CTRL-C (SIGINT) desde la terminal. Estoy usando la utilidad make para ejecutar esta aplicación.

Si ejecuto el proceso manualmente (sin la regla 'hacer ejecutar'), las señales llegan correctamente. He leído mucho en la web como:

La señal SIGINT es generada por la disciplina de línea del terminal y se transmite a todos los procesos en el grupo de procesos de primer plano del terminal.

Según esta afirmación, ¿por qué si en la terminal el proceso en primer plano es la aplicación, no puede recibir la interrupción CTRL-C? El grupo de procesos es diferente entre la marca y la aplicación:

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

pero en el momento en que presiono CTRL-C estoy buscando el bin/application, y no el make. Por lo tanto, debería enviar la señal al bin/applicationgrupo de procesos. Pero aparentemente no es así.

Entonces mi pregunta es ¿cuál es el verdadero receptor de la señal en este caso? Gracias por el consejo

información relacionada