2013-05-23 28 views
22

Điều gì có thể gây ra chương trình C, MPI sử dụng thư viện có tên là SUNDIALS/CVODE (bộ giải mã ODE bằng số) chạy trên cụm Gentoo Linux để cho tôi lặp lại Signal 15 received.?"Tín hiệu 15 đã nhận được"

Mã đó có phải do MPI, Sundials, Linux, C hoặc ai cấp không?

Lưu ý rằng tôi khá nhiều người mới bắt đầu với các công nghệ sau: C, MPI, SUNDIALS/CVODE và Linux.

Tôi không thể tìm thấy điều gì có vẻ liên quan đến googling the message. Tôi thậm chí không biết bắt đầu từ đâu. (Đây là một trong những câu hỏi mà "bất cứ điều gì giúp" được thực hiện theo đúng nghĩa đen.)

(Là một phần/lý do tại sao từ điển của Chrome không nhận ra từ "googling"?).

+1

Tín hiệu 15 thường là 'SIGTERM'. Ai đó đã nói với chương trình của bạn để chấm dứt. –

Trả lời

39

Điều này cho biết Linux đã gửi SIGTERM cho quy trình của bạn. Điều này thường theo yêu cầu của một số quy trình khác (thông qua kill()) nhưng cũng có thể được gửi bởi quá trình của bạn cho chính nó (sử dụng raise()). Tín hiệu này yêu cầu tắt máy theo trật tự quy trình của bạn.

Nếu bạn cần một cheatsheet nhanh chóng của số tín hiệu, mở một shell bash và:

$ 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  

Bạn có thể xác định người gửi bằng cách sử dụng một bộ xử lý tín hiệu thích hợp như:

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

Chú ý rằng bộ xử lý tín hiệu cũng bao gồm một cuộc gọi đến exit(). Cũng có thể chương trình của bạn tiếp tục thực thi bằng cách bỏ qua tín hiệu, nhưng điều này không được khuyến nghị nói chung (nếu đó là người dùng thực hiện nó thì có khả năng nó sẽ được theo sau bởi SIGKILL nếu quy trình của bạn không thoát và bạn đã mất cơ hội để làm bất kỳ việc dọn dẹp nào).

+0

Danh sách này không hữu ích. Bất kỳ ý tưởng làm thế nào tôi có thể xác định ai đang gửi cho tôi SIGTERM? Điều duy nhất tôi có thể nói là mã của tôi không làm điều đó (vì tôi không biết cách gửi một SIGTERM). – Jeff

+1

@ Jeff: Tôi đã cập nhật bài đăng của mình bằng một đoạn trích giúp bạn xác định pid của người gửi. Để xem nó hoạt động, bạn có thể chạy mã đó và từ một trình bao khác chạy "kill " để xem nó in pid của người gửi. – FatalError

+0

Cảm ơn mã @FatalError (tên mát, btw). Tôi nhận được rằng điều này sẽ cho tôi thấy PID của quá trình SIGTERMing và tôi đã biên dịch nó. Nhưng làm thế nào để sử dụng nó? Nó có phải là một chương trình độc lập chạy trong nền trong khi tôi chạy chương trình của tôi? Nếu vậy, làm thế nào để tôi khởi động nó? Tôi có cần phải chạy chương trình này trên mỗi nút của cụm (oops, tôi đã quên đề cập đến chương trình của tôi đang chạy trên một cụm?)? Giả sử tôi đang sử dụng 'màn hình', nó có cần chạy trong mỗi màn hình không? Tôi biết, có một câu hỏi, nhưng tôi bị lạc. – Jeff

Các vấn đề liên quan