私はこのコードを持っています:
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
しかし、明らかにそうではありません。
だから私の質問は、この場合、信号の実際の受信機は何ですか?アドバイスありがとうございます