프로세스 그룹 변경 후 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 인터럽트를 수신할 수 없는 이유는 무엇입니까? 프로세스 그룹은 제조업체와 애플리케이션마다 다릅니다.

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그러나 분명히 그렇지 않습니다.

그래서 내 질문은 이 경우 신호의 실제 수신기는 무엇입니까? 조언해주셔서 감사합니다

관련 정보