更改进程组后无法接收 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的进程组。但显然事实并非如此。

所以我的问题是在这种情况下信号的真正接收者是什么?谢谢你的建议

相关内容