我有這個代碼:
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
的進程組。但顯然事實並非如此。
所以我的問題是在這種情況下訊號的真正接收者是什麼?謝謝你的建議