Восстановление исходного сигнала в сиграции - PullRequest
1 голос
/ 15 сентября 2011

У меня есть sigaction, и он работает нормально. Однако я хочу восстановить исходный сигнал после того, как мое действие будет завершено. Это моя подпись:

static void signal_handler(int signal, siginfo_t *info, void *reserved)
{
    //Some logging statements
    //How do I restore the original signal here??
}

Обработчик сигнала устанавливается из JNI_Onload:

extern "C" jint JNI_OnLoad(JavaVM* vm, void* /*reserved*/)
{
    struct sigaction handler, action_old;
    memset(&handler, 0, sizeof(handler));
    handler.sa_sigaction = signal_handler;
    handler.sa_flags = SA_SIGINFO;
    sigaction(SIGILL, &handler, &action_old);
    sigaction(SIGABRT, &handler, &action_old);
    sigaction(SIGBUS, &handler, &action_old);
    sigaction(SIGFPE, &handler, &action_old);
    sigaction(SIGSEGV, &handler, &action_old);
    sigaction(SIGSTKFLT, &handler, &action_old);

    //Can I restore prior signal here???

    return JNI_VERSION_1_6;
}

Ответы [ 2 ]

2 голосов
/ 15 сентября 2011

Сохраните старые действия в глобальных (или в файловой области) переменных (или массиве, проиндексированном по идентификатору сигнала) и вызовите sigaction из вашего обработчика сигнала, чтобы восстановить предыдущее поведение. sigaction гарантированно безопасен для асинхронного сигнала.

Смотри также: http://pubs.opengroup.org/onlinepubs/9699919799/functions/V2_chap02.html#tag_15_04_03

0 голосов
/ 15 сентября 2011

http://www.gnu.org/s/hello/manual/libc/Basic-Signal-Handling.html - говорит:

Функция сигнала возвращает действие, которое ранее действовало для указанного знака.Вы можете сохранить это значение и восстановить его позже, вызвав сигнал снова.

...