2013-05-23 22 views
22

nedir? Signal 15 received.'un tekrar edilmesini sağlamak için bir Gentoo Linux kümesinde çalışan SUNDIALS/CVODE (sayısal ODE çözücü) adlı bir kitaplık kullanarak bir C, MPI programına neden olabilir?"Sinyal 15 alındı"

Bu kod MPI, Sundials, Linux, C veya kim tarafından veriliyor?

Şu teknolojilerle yeni başlayan biriyim: C, MPI, SUNDIALS/CVODE ve Linux.

googling the message ile ilgili görülen hiçbir şey bulamıyorum. Bakmaya nereden başlayacağımı bile bilmiyorum. (Bu, "herhangi bir şeyin yardımcı olabileceği" kelimelerinin tam anlamıyla alınabileceği sorulardan biridir.)

(Daha önce/sonradan, Chrome'un sözlüğü "googling" kelimesini neden tanımaz?).

+1

Sinyal 15 genellikle SIGTERM'dir. Birisi programınızı sonlandırmak için söyledi. –

cevap

39

Bu, linux'un işleminize bir SIGTERM teslim ettiğini gösterir. Bu genellikle başka bir sürecin (kill() aracılığıyla) isteği ile gerçekleşir, ancak işleminiz tarafından da gönderilebilir (raise()). Bu sinyal, sürecinizin düzenli olarak kapatılmasını ister. Eğer sinyal numaraları hızlı Pardus gerekiyorsa

, bir bash kabuk açıp:

$ 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  

Sen gönderen belirleyebilir gibi uygun bir sinyal işleyici kullanarak: yani

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

Bildirimi Sinyal işleyici ayrıca exit() numaralı aramayı da içerir. Programınızın sinyali görmezden gelmeye devam etmesi de mümkündür, ancak bu genel olarak önerilmemektedir (eğer bir kullanıcı yapıyorsa, işleminiz çıkmazsa SIGKILL tarafından takip edilecek iyi bir şans vardır ve Daha sonra herhangi bir temizlik yapma fırsatını kaybettin).

+0

Bu liste çok yardımcı olmuyor. SIGTERM'i kimin gönderdiğini nasıl belirleyebileceğime dair bir fikrin var mı? Söyleyebileceğim tek şey kodumun bunu yapmamasıdır (çünkü SIGTERM'in nasıl gönderileceğini bilmiyorum). – Jeff

+1

@Jeff: Gönderiyi gönderenin pidini belirlemenize yardımcı olacak bir snippet ile güncelledim. Hareket halindeyken görebilmek için bu kodu çalıştırabilirsiniz ve gönderenin pidini yazdırmak için başka bir kabuktan "'u öldür" komutunu çalıştırabilirsiniz. – FatalError

+0

@FatalError kodu (cool name, btw) için teşekkürler. Bunu SIGTERMing sürecinin PID'sini göstereceğim ve onu derledim. Ama nasıl kullanırım? Programımı yürütürken arka planda çalışan bağımsız bir program olması mı gerekiyor? Eğer öyleyse, nasıl başlarım? Kümenin her düğümünde bu programı çalıştırmam gerekiyor mu (oops, programımın bir kümede çalıştığından bahsetmeyi unuttum mu?)? Ekranı kullanıyorum farz edelim, her ekranda çalıştırılmalı mı? Biliyorum, çok soru var ama ben kayboldum. – Jeff