Tengo 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);
}
}
Después de cambiar el grupo de procesos
setpgid(0, 0);
Ya no pude recibir CTRL-C (SIGINT) desde la terminal. Estoy usando la utilidad make para ejecutar esta aplicación.
Si ejecuto el proceso manualmente (sin la regla 'hacer ejecutar'), las señales llegan correctamente. He leído mucho en la web como:
La señal SIGINT es generada por la disciplina de línea del terminal y se transmite a todos los procesos en el grupo de procesos de primer plano del terminal.
Según esta afirmación, ¿por qué si en la terminal el proceso en primer plano es la aplicación, no puede recibir la interrupción CTRL-C? El grupo de procesos es diferente entre la marca y la aplicación:
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
pero en el momento en que presiono CTRL-C estoy buscando el bin/application
, y no el make
. Por lo tanto, debería enviar la señal al bin/application
grupo de procesos. Pero aparentemente no es así.
Entonces mi pregunta es ¿cuál es el verdadero receptor de la señal en este caso? Gracias por el consejo