我有这个代码:
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
的进程组。但显然事实并非如此。
所以我的问题是在这种情况下信号的真正接收者是什么?谢谢你的建议