C “什么是”呢;接收到信号15“;

C “什么是”呢;接收到信号15“;,c,linux,mpi,ode,C,Linux,Mpi,Ode,是什么原因导致在Gentoo Linux集群上运行的C、MPI程序使用一个名为(数值ODE解算器)的库,向我重复发送信号15。 这些代码是由MPI、Sundals、Linux、C还是谁发布的 请注意,我基本上是以下技术的初学者:C、MPI、Sundals/CVODE和Linux 我找不到任何与你有关的东西。我甚至不知道从哪里开始找。(这是其中的一个问题,“任何有帮助的东西”都可以从字面上理解。) (作为旁白/事后思考,为什么Chrome的字典不能识别“谷歌搜索”这个词呢?)这表明linux向您的

是什么原因导致在Gentoo Linux集群上运行的C、MPI程序使用一个名为(数值ODE解算器)的库,向我重复发送
信号15。

这些代码是由MPI、Sundals、Linux、C还是谁发布的

请注意,我基本上是以下技术的初学者:C、MPI、Sundals/CVODE和Linux

我找不到任何与你有关的东西。我甚至不知道从哪里开始找。(这是其中的一个问题,“任何有帮助的东西”都可以从字面上理解。)


(作为旁白/事后思考,为什么Chrome的字典不能识别“谷歌搜索”这个词呢?)

这表明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;
}
#包括
#包括
#包括
无效sigterm_处理程序(int信号、siginfo_t*info、无效*_未使用)
{
fprintf(stderr,“从pid=%u的进程接收到SIGTERM”,
信息->si_pid);
出口(0);
}
内部主(空)
{
结构sigaction操作={
.sa_handler=NULL,
.sa_sigaction=sigterm_handler,
.sa_mask=0,
.sa_flags=sa_SIGINFO,
.sa_restorer=NULL
};
sigation(SIGTERM和action,NULL);
睡眠(60);
返回0;
}

请注意,信号处理程序还包括对
exit()
的调用。您的程序也可以通过忽略该信号继续执行,但通常不建议这样做(如果是用户这样做,如果您的进程不退出,则很有可能随后出现SIGKILL,然后您就失去了执行任何清理的机会)。

信号15通常是
SIGTERM
。有人让你的程序终止。这个列表没有多大帮助。你知道我怎样才能确定谁给我发了这个SIGTERM吗?我唯一能说的是我的代码没有这样做(因为我不知道如何发送SIGTERM)。@Jeff:我已经用一个片段更新了我的帖子,可以帮助你确定发送者的pid。要查看它的运行情况,您可以运行该代码,并从另一个shell运行“kill”以查看它打印发送者的pid。感谢代码@FatalError(酷名称,顺便说一句)。我知道这会显示SIGTERMing进程的PID,我编译了它。但是我如何使用它呢?当我运行我的程序时,它应该是在后台运行的独立程序吗?如果是,我该如何开始?我需要在集群的每个节点上运行这个程序吗(哎呀,我忘了提到我的程序在集群上运行了吗?)?假设我使用的是
屏幕
,它是否需要在每个屏幕中运行?我知道,有很多问题,但我迷路了。@Jeff:那代码只是一个演示。对于您的代码,您应该将sigaction()调用放在程序开头附近的某个地方,当然您也需要信号处理函数。然后,尽你所能让这个词正常。此时,您的程序将显示发送它的人的pid。然后检查该节点上的
ps-Af
,您可以精确地搞定发送它的内容。@FE当我将您的代码添加到我的程序中时,我得到以下编译警告:
警告:初始化器周围缺少大括号
。它运行正常,但当我收到信号15消息时,消息没有出现。当程序在后台运行时(使用
&
启动它),这会起作用吗?