39

什么可能导致使用在 Gentoo Linux 集群上运行的名为SUNDIALS/CVODE (数值 ODE 求解器)的库的 C、MPI 程序重复给我Signal 15 received.

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

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

通过谷歌搜索消息,我找不到任何似乎相关的内容。我什至不知道从哪里开始寻找。(这是从字面上理解“任何有帮助”的问题之一。)

(顺便说一句,为什么 Chrome 的字典不能识别“谷歌搜索”这个词?)。

4

1 回答 1

68

这表明 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,并且你失去了做任何清理的机会)。

于 2013-05-23T20:52:40.807 回答