2011-07-08 16 views
9

Tôi là người mới sử dụng các tín hiệu Linux, vui lòng trợ giúp. Đoạn mã sau nhận được kết xuất lõi khi chạy trong Linux 2.6 gcc.Tín hiệu Câu hỏi SIGFPE

$ ./a.out
Floating point ngoại lệ (core dumped)

Những câu hỏi:
1. Kể từ khi một mặt nạ tín hiệu quá trình đã được cài đặt, nên không phải là "SIGFPGE" được tạo ra bởi dòng 40 (z = x/y) có bị chặn không?
2. Nếu nó không bị chặn, vì trình xử lý tín hiệu đã được cài đặt, không nên "SIGFPE" bị bộ xử lý tín hiệu ghi lại, thay vì đổ lõi?
3. Nếu tôi nhận xét ra dòng 40 (z = x/y), và sử dụng dòng 42 (nâng cao (SIGFPE)) thay vào đó, sau đó mọi thứ hoạt động như tôi mong đợi. Sự khác biệt giữa x/0 và nâng cao SIGFPE ở đây là gì?

Đây là mã:

#include <stdio.h> 
    #include <stdlib.h> 
    #include <signal.h> 

    void sig_handler(int signum) 
    { 
     printf("sig_handler() received signal %d\n", signum); 
    } 


    int main(int argc, char * argv[]) 
    { 

     // setup signal mask, block all signals 
     sigset_t set; 
     sigfillset(&set); 

     if(sigprocmask(SIG_BLOCK, &set, NULL)<0) 
     { 
      perror("failed to set sigmask"); 
      return -1; 
     } 

     // install signal handler for SIGFPE 
     struct sigaction act; 
     act.sa_handler = sig_handler; 
     act.sa_mask = set; 
     act.sa_flags = 0; 
     if(sigaction(SIGFPE, &act, NULL)<0) 
     { 
      perror("sigaction failed"); 
      exit(-1); 
     } 

     volatile int x =1; 
     volatile int y =0; 
     volatile int z = x/y; 

     //raise(SIGFPE); 

     printf("point 1000\n"); 

     return 0; 
    } 

Trả lời

4

Bất kỳ SIGFPE do một cái bẫy phần cứng trong khi tín hiệu bị chặn gây ra hành vi undefined:

Nếu bất kỳ SIGFPE, SIGILL, SIGSEGV, hoặc SIGBUS tín hiệu được tạo ra trong khi chúng bị chặn, kết quả là không xác định, trừ khi tín hiệu được tạo ra bởi hàm kill(), hàm sigqueue() hoặc hàm raise().

(từ sigprocmask specification)

+0

+1. Mặc dù thông số mới nhất là [Vấn đề 7] (http://pubs.opengroup.org/onlinepubs/9699919799/functions/sigprocmask.html). :-) – Nemo

+0

@Nemo: Cảm ơn. Quy tắc vẫn còn đó, nhưng từ ngữ đã thay đổi một chút, vì vậy tôi đã cập nhật câu trả lời của mình. –

+1

Cảm ơn câu trả lời. Tôi ghét "không xác định". –