나는 이 코드를 가지고 있습니다 :
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
그러나 분명히 그렇지 않습니다.
그래서 내 질문은 이 경우 신호의 실제 수신기는 무엇입니까? 조언해주셔서 감사합니다