更改進程組後無法接收 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的進程組。但顯然事實並非如此。

所以我的問題是在這種情況下訊號的真正接收者是什麼?謝謝你的建議

相關內容