次のようなコードがあります:
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」ルールなし)、信号は正常に到着します。Web 上で次のようなことをたくさん読みました。
SIGINT シグナルは端末のライン制御によって生成され、端末のフォアグラウンド プロセス グループ内のすべてのプロセスにブロードキャストされます。
この主張によれば、ターミナルでフォアグラウンド プロセスがアプリケーションである場合、なぜ CTRL-C 割り込みを受信できないのでしょうか。プロセス グループは、make とアプリケーションで異なります。
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
のプロセス グループに送信されるはずです。しかし、どうやらそうではないようです。
私の質問は、この場合の信号の本当の受信者は誰なのかということです。アドバイスをお願いします