Best practices for recovering from a segmentation fault

It is actually possible in C. You can achieve it in quite a complicated way:

1) Override signal handler

2) Use setjump() and longjmp() to set the place to jump back, and to actually jump back to there.

Check out this code I wrote (idea taken from “Expert C Programming: Deep C Secrets” by Peter Van Der Linden):

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

//Declaring global jmp_buf variable to be used by both main and signal handler
jmp_buf buf;

void magic_handler(int s)


        case SIGSEGV:
        printf("\nSegmentation fault signal caught! Attempting recovery..");
        longjmp(buf, 1);

    printf("\nAfter switch. Won't be reached");


int main(void) 

    int *p = NULL;

    signal(SIGSEGV, magic_handler);


         //Trying to dereference a null pointer will cause a segmentation fault, 
         //which is handled by our magic_handler now.

        printf("\nSuccessfully recovered! Welcome back in main!!\n\n"); 

    return 0;

Leave a Comment