Categories
工作

No core will be dumped when calling exit() in a signal handler

The customized abnormal signal handler (e.g. SIGSEGV handler) will function abnormally if we call exit() inside the handler: the program will exit “as normal” however it did had some severe memory issue.
See code snippet below, try to run with / without “X” argument.

/* exit example */
#include <stdio.h>      /* printf, fopen */
#include <stdlib.h>     /* exit, EXIT_FAILURE */
#include <signal.h>     /* signal */
#include <string.h>
bool disable_exit = false;
void InitiateAbnormalShutdown()
{
    printf("ABNORMAL SHUTDOWN!!!\n");
    if (!disable_exit)
        exit(EXIT_FAILURE);
}
void AbnormalSignalHandler(int signo)
{
    signal(signo, SIG_DFL);
    InitiateAbnormalShutdown();
    raise(signo);
}
bool give_me_an_error()
{
    int* test = new int;
    *test = 500;
    delete test;
    test = NULL;
    *test = 900;
    if (*test > 500)
    {
        return false;
    }
    return true;
}
int main(int argc, char *argv[])
{
    if (argc > 1)
    {
        printf("arg == %s\n", argv[1]);
        if (strcmp(argv[1], "X") == 0)
        {
            printf("disable exit on abnormal handler...\n");
            disable_exit = true;
        }
    }
    signal(SIGSEGV, AbnormalSignalHandler);
    give_me_an_error();
    return 0;
}

Output:

bowei.he:/sandbox/bowei.he/temp$ ./sigf
ABNORMAL SHUTDOWN!!!
bowei.he:/sandbox/bowei.he/temp$ ./sigf X
arg == X
disable exit on abnormal handler...
ABNORMAL SHUTDOWN!!!
Segmentation fault (core dumped)

 
 

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.