español - mpicc
¿Qué es “Señal 15 recibida”? (1)
¿Qué podría hacer que un programa C, MPI que utiliza una biblioteca llamada SUNDIALS/CVODE (un solucionador numérico de ODE) se ejecute en un clúster de Gentoo Linux para que Signal 15 received.
repetidas Signal 15 received.
?
¿Es ese código emitido por MPI, Sundials, Linux, C o quién?
Tenga en cuenta que soy prácticamente un principiante con las siguientes tecnologías: C, MPI, SUNDIALS / CVODE y Linux.
No puedo encontrar nada que parezca relacionado al buscar en Google el mensaje . Ni siquiera sé por dónde empezar a mirar. (Esta es una de esas preguntas donde "cualquier cosa ayuda" debe tomarse literalmente).
(Como comentario adicional, ¿por qué el diccionario de Chrome no reconoce la palabra "googlear"?).
Esto indica que Linux ha entregado un SIGTERM
a su proceso. Esto suele ser a petición de algún otro proceso (a través de kill()
), pero también puede ser enviado por su proceso a sí mismo (utilizando raise()
). Esta señal solicita un cierre ordenado de su proceso.
Si necesita una hoja rápida de números de señal, abra un shell bash y:
$ kill -l
1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL
5) SIGTRAP 6) SIGABRT 7) SIGBUS 8) SIGFPE
9) SIGKILL 10) SIGUSR1 11) SIGSEGV 12) SIGUSR2
13) SIGPIPE 14) SIGALRM 15) SIGTERM 16) SIGSTKFLT
17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP
21) SIGTTIN 22) SIGTTOU 23) SIGURG 24) SIGXCPU
25) SIGXFSZ 26) SIGVTALRM 27) SIGPROF 28) SIGWINCH
29) SIGIO 30) SIGPWR 31) SIGSYS 34) SIGRTMIN
35) SIGRTMIN+1 36) SIGRTMIN+2 37) SIGRTMIN+3 38) SIGRTMIN+4
39) SIGRTMIN+5 40) SIGRTMIN+6 41) SIGRTMIN+7 42) SIGRTMIN+8
43) SIGRTMIN+9 44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12
47) SIGRTMIN+13 48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14
51) SIGRTMAX-13 52) SIGRTMAX-12 53) SIGRTMAX-11 54) SIGRTMAX-10
55) SIGRTMAX-9 56) SIGRTMAX-8 57) SIGRTMAX-7 58) SIGRTMAX-6
59) SIGRTMAX-5 60) SIGRTMAX-4 61) SIGRTMAX-3 62) SIGRTMAX-2
63) SIGRTMAX-1 64) SIGRTMAX
Puede determinar el remitente utilizando un manejador de señales apropiado como:
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
void sigterm_handler(int signal, siginfo_t *info, void *_unused)
{
fprintf(stderr, "Received SIGTERM from process with pid = %u/n",
info->si_pid);
exit(0);
}
int main (void)
{
struct sigaction action = {
.sa_handler = NULL,
.sa_sigaction = sigterm_handler,
.sa_mask = 0,
.sa_flags = SA_SIGINFO,
.sa_restorer = NULL
};
sigaction(SIGTERM, &action, NULL);
sleep(60);
return 0;
}
Observe que el manejador de señales también incluye una llamada a exit()
. También es posible que su programa continúe ejecutándose al ignorar la señal, pero esto no se recomienda en general (si es un usuario que lo hace, es muy probable que lo siga un SIGKILL si su proceso no finaliza, y perdiste la oportunidad de hacer cualquier limpieza entonces).