在sigaction中恢复原始信号

时间:2011-09-14 21:05:51

标签: c java-native-interface signals signal-handling

我已经定义了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 个答案:

答案 0 :(得分:2)

将旧操作保存在全局(或文件范围)变量(或由信号id索引的数组)中,并从信号处理程序内部调用sigaction以恢复先前的行为。 sigaction保证异步信号安全。

另请参阅:http://pubs.opengroup.org/onlinepubs/9699919799/functions/V2_chap02.html#tag_15_04_03

答案 1 :(得分:0)

http://www.gnu.org/s/hello/manual/libc/Basic-Signal-Handling.html - 说:

  

signal函数返回先前对指定的signum有效的动作。您可以保存此值并稍后通过再次调用信号来恢复它。