Дамп ядра исключения с плавающей точкой

Я новичок в сигналах Linux, пожалуйста, помогите. Следующий код получает дамп ядра при запуске в Linux 2.6 gcc.

$ ./a.out
Исключение плавающей точки (дамп ядра)

Вопросы:
1. Поскольку установлена ​​маска сигналов процесса, не следует ли блокировать «SIGFPGE», генерируемый строкой 40 volatile int z = x / y; ?
2. Если он не заблокирован, так как обработчик сигналов был установлен, не должен ли обработчик сигнала захватывать SIGFPE вместо дампа ядра?
3. Если я закомментировал строку 40 volatile int z = x / y; и использовал вместо нее строку 42 raise (SIGFPE); , то все будет работать так, как я ожидал. В чем разница между x / 0 и поднять SIGFPE?

Вот код:

    #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; //line 40

       //raise(SIGFPE); //line 42

       printf("point 1000\n");

       return 0;
    }
10
задан Robert Houghton 4 July 2019 в 17:54
поделиться