Segmentation fault handling

后端 未结 7 1217
轻奢々
轻奢々 2020-11-27 05:23

I have an application which I use to catch any segmentation fault or ctrl-c. Using the below code, I am able to catch the segmentation fault but the handler is being called

相关标签:
7条回答
  • 2020-11-27 06:04

    I do not agree at all with the statement "Don't catch the SIGSEGV".

    That's a pretty good pratice to deal with unexpected conditions. And that's much cleaner to cope with NULL pointers (as given by malloc failures) with signal mechanism associated to setjmp/longjmp, than to distribute error condition management all along your code.

    Note however that if you use ''sigaction'' on SEGV, you must not forget to say SA_NODEFER in sa_flags - or find another way to deal with the fact SEGV will trigger your handler just once.

    #include <setjmp.h>
    #include <signal.h>
    #include <stdio.h>
    #include <string.h>
    
    static void do_segv()
    {
      int *segv;
    
      segv = 0; /* malloc(a_huge_amount); */
    
      *segv = 1;
    }
    
    sigjmp_buf point;
    
    static void handler(int sig, siginfo_t *dont_care, void *dont_care_either)
    {
       longjmp(point, 1);
    }
    
    int main()
    {
      struct sigaction sa;
    
      memset(&sa, 0, sizeof(sigaction));
      sigemptyset(&sa.sa_mask);
    
      sa.sa_flags     = SA_NODEFER;
      sa.sa_sigaction = handler;
    
      sigaction(SIGSEGV, &sa, NULL); /* ignore whether it works or not */ 
    
      if (setjmp(point) == 0)
       do_segv();
    
      else
        fprintf(stderr, "rather unexpected error\n");
    
      return 0;
    }
    
    0 讨论(0)
提交回复
热议问题