什么是"信号15收到"

时间:2013-05-23 20:48:23

标签: c linux mpi ode

使用在Gentoo Linux集群上运行的名为SUNDIALS/CVODE(数字ODE解算器)的库的C,MPI程序可能会重复Signal 15 received.

该代码是由MPI,Sundials,Linux,C还是谁发布的?

请注意,我几乎是初学者,拥有以下技术:C,MPI,SUNDIALS / CVODE和Linux。

googling the message我找不到任何与之相关的内容。我甚至不知道从哪里开始看。 (这是其中一个问题,其中“任何有用的”都是字面意思。)

(作为抛开/事后的想法,为什么Chrome的字典不会识别“google搜索”这个词?)。

1 个答案:

答案 0 :(得分:45)

这表明Linux已为您的流程提供了SIGTERM。这通常是应某些其他流程的请求(通过kill()),但也可以由您的流程发送给自己(使用raise())。此信号要求有序关闭您的流程。

如果您需要信号编号的快速备忘单,请打开bash shell并:

$ 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    

您可以使用适当的信号处理程序来确定发件人,如:

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

请注意,信号处理程序还包括对exit()的调用。你的程序也可以通过忽略信号继续执行,但一般不建议这样做(如果是用户这样做的话,如果你的进程没有退出,很可能会跟着一个SIGKILL,并且你失去了做任何清理工作的机会。)