2

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;
}
4

2 に答える 2

2

古いアクションをグローバル(またはファイルスコープ)変数(またはシグナルIDでインデックス付けされた配列)に保存し、sigactionシグナルハンドラー内から呼び出して、以前の動作を復元します。 sigaction非同期信号に対して安全であることが保証されています。

参照:http://pubs.opengroup.org/onlinepubs/9699919799/functions/V2_chap02.html#tag_15_04_03

于 2011-09-14T21:21:10.277 に答える
0

http://www.gnu.org/s/hello/manual/libc/Basic-Signal-Handling.html-言います:

シグナル関数は、指定されたシグナムに対して以前に有効だったアクションを返します。この値を保存し、後でsignalを再度呼び出すことで復元できます。

于 2011-09-14T21:19:49.147 に答える