Eu tenho este código:
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);
}
}
Depois de alterar o grupo de processos
setpgid(0, 0);
Não consegui mais receber CTRL-C (SIGINT) do terminal. Estou usando o utilitário make para executar este aplicativo.
Se eu executar o processo manualmente (sem a regra 'make run'), os sinais chegarão com sucesso. Eu tenho vermelho muito na web como:
O sinal SIGINT é gerado pela disciplina de linha terminal e transmitido para todos os processos no grupo de processos de primeiro plano do terminal.
De acordo com esta afirmação, por que se no terminal o processo em primeiro plano é a aplicação, ele não pode receber a interrupção CTRL-C? O grupo de processos é diferente entre a marca e a aplicação:
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
mas na hora que pressiono CTRL-C estou procurando o bin/application
, e não o make
. Portanto, ele deve enviar o sinal para o bin/application
grupo de processos do. Mas aparentemente isso não acontece.
Então minha pergunta é qual é o verdadeiro receptor do sinal neste caso? Obrigado em conselhos