プロセスグループの変更後に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しかし、明らかにそうではありません。

だから私の質問は、この場合、信号の実際の受信機は何ですか?アドバイスありがとうございます

ベストアンサー1

おすすめ記事