プロセスグループを変更した後、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」ルールなし)、信号は正常に到着します。Web 上で次のようなことをたくさん読みました。

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のプロセス グループに送信されるはずです。しかし、どうやらそうではないようです。

私の質問は、この場合の信号の本当の受信者は誰なのかということです。アドバイスをお願いします

関連情報