我已经定义了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;
}
答案 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有效的动作。您可以保存此值并稍后通过再次调用信号来恢复它。