web-dev-qa-db-fra.com

Qu'est-ce que "Signal 15 reçu"

Qu'est-ce qui pourrait provoquer un C, MPI utilisant une bibliothèque appelée SUNDIALS/CVODE (un solveur ODE numérique) fonctionnant sur un cluster Gentoo Linux pour me donner _ Signal 15 received.?

Ce code est-il émis par MPI, Sundials, Linux, C ou qui?

Notez que je suis à peu près un débutant avec les technologies suivantes: C, MPI, SUNDIALS/CVODE et Linux.

Je ne trouve rien qui semble lié par googler le message . Je ne sais même pas par où commencer. (C'est l'une de ces questions où "tout ce qui peut aider" doit être pris au pied de la lettre.)

(En passant/après coup, pourquoi le dictionnaire de Chrome ne reconnaît-il pas le mot "googler"?).

28
Jeff

Cela indique que Linux a fourni un SIGTERM à votre processus. Ceci est généralement à la demande d'un autre processus (via kill()) mais peut également être envoyé par votre processus à lui-même (en utilisant raise()). Ce signal demande un arrêt ordonné de votre processus.

Si vous avez besoin d'une feuille de calcul rapide des numéros de signaux, ouvrez un shell bash et:

$ 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    

Vous pouvez déterminer l'expéditeur en utilisant un gestionnaire de signal approprié comme:

#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;
}

Notez que le gestionnaire de signal inclut également un appel à exit(). Il est également possible que votre programme continue de s'exécuter en ignorant le signal, mais ce n'est pas recommandé en général (si c'est un utilisateur qui le fait, il y a de fortes chances qu'il soit suivi d'un SIGKILL si votre processus ne se termine pas, et vous avez alors perdu l'occasion de faire le nettoyage).

46
FatalError