Как правильно обрабатывать sigaction () и возвращать родительскому процессу - PullRequest
0 голосов
/ 18 июня 2019

Есть ли способ перехватить сигнал с помощью sigaction и вернуться к родительскому процессу после правильной обработки ошибки?Чтобы быть более точным, следуя коду, я могу сделать некоторые ошибки, но другие не могут получить такое же уведомление о сбое после моего обработчика sigaction...Большое спасибо!

static struct sigaction g_defaultsigsegvhndlr;

VOID InvokeDefaultHndlr(
    struct sigaction* pAction,
    INT32             sigNum,
    siginfo_t*        pSigInfo,
    VOID*             pContext)
{
    if (pAction->sa_flags & SA_SIGINFO)
    {
        pAction->sa_sigaction(sigNum, pSigInfo, pContext);
    }
    else
    {
        pAction->sa_handler(sigNum);
    }
}

VOID SignalCatcher(
    INT32      sigNum,
    siginfo_t* pSigInfo,
    VOID*      pContext)
{    
    switch (sigNum)
    {
        case SIGSEGV:
            InvokeDefaultHndlr(&g_defaultsigsegvhndlr, sigNum, pSigInfo, pContext);
            break;
        default:
            {
            }
    }
}

VOID RegisterSignal()
{
    struct sigaction newSigAction;

    memset(&newSigAction, '\0', sizeof(struct sigaction));

    if (sigaction(SIGSEGV, NULL, &g_defaultsigsegvhndlr) < 0)
    {
        ALOGE("Failed to get signal handler for SIGSEGV");
    }

    newSigAction              = g_defaultsigsegvhndlr;
    newSigAction.sa_flags    |= SA_SIGINFO;
    newSigAction.sa_sigaction = SignalCatcher;

    if (sigaction(SIGSEGV, &newSigAction, NULL) < 0)
    {
        ALOGE("Failed to register signal handler for SIGSEGV");
    }
}

// Just a sample, I will invoke RegisterSignal() in main thread loop
int main()
{
    ...
    RegisterSignal();
    ...
}
...