2013-05-23 12 views
22

Gentoo Linuxクラスタで実行中のSUNDIALS/CVODE(数値ODEソルバー)というライブラリを使用して、C、MPIプログラムがSignal 15 received.を繰り返し実行する可能性はありますか?「シグナル15を受信しました」

このコードは、MPI、Sundials、Linux、C、または誰によって発行されていますか?

私は、C、MPI、SUNDIALS/CVODE、Linuxという次のテクノロジの初心者です。

私はgoogling the messageと関連すると思われるものは何も見つかりません。私はどこを見始めるべきか分からない。 (これは「何かが助けてくれること」が文字通り取られる質問の1つです)

(なぜかChromeの辞書は「グーグル」という単語を認識しません)

+1

シグナル15は、通常、 'SIGTERM'です。誰かがあなたのプログラムに終了を指示しました。 –

答えて

39

これは、LinuxがSIGTERMをプロセスに配信したことを示しています。これは通常、他のプロセスからのリクエスト(kill()経由)ですが、プロセスによって自分自身に送信することもできます(raise()を使用)。このシグナルは、プロセスの正常なシャットダウンを要求します。

あなたはシグナル番号の迅速なチートシートが必要な場合は、bashシェルを開いて

と:

$ 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が続く可能性がありますあなたはそれからクリーンアップをする機会を失いました)。

+0

このリストはあまり役に立ちません。誰が私にSIGTERMを送るのかをどのように判断できるのか?私が言うことができるのは、私のコードがそれをやっていないということだけです(SIGTERMを送る方法がわからないので)。 – Jeff

+1

@Jeff:送信者のpidを判断するのに役立つスニペットで投稿を更新しました。そのコードを実行するには、そのコードを実行して、別のシェルから "kill "を実行して、送信者のPIDを表示するようにします。 – FatalError

+0

@FatalError(cool name、btw)というコードをありがとう。私はこれがSIGTERMingプロセスのPIDを表示することになると私はそれをコンパイルしました。しかし、私はそれをどのように使うのですか?私は自分のプログラムを実行している間に、スタンドアロンのプログラムをバックグラウンドで実行することになっていますか?もしそうなら、私はそれをどのように蹴りますか?このプログラムをクラスタの各ノードで実行する必要がありますか(私のプログラムはクラスタで動作していると言えますか?)私が 'screen'を使っているとします。それは各画面で動かす必要がありますか?私は知っている、ロッタの質問が、私は失われています。 – Jeff

関連する問題