Pro*C (C コード用の Oracle の組み込み SQL プリプロセッサ) または OCI を使用しているときに、connect/init ルーチンがいくつかのシグナル ハンドラをインストールすることに気付きました。
つまり、
EXEC SQL CONNECT :username IDENTIFIED BY :password USING :dbspec ;
または
OCIEnvNlsCreate()
たとえば、これらのシグナルに次のハンドラーがあることを確認できます。
No NAME Pointer SA_SIGINFO SIG_DFL SIG_IGN
―――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――
1 SIGHUP (nil) false true false
2 SIGINT (nil) false true false
3 SIGQUIT (nil) false true false
4 SIGILL (nil) false true false
5 SIGTRAP (nil) false true false
6 SIGABRT (nil) false true false
7 SIGBUS (nil) false true false
8 SIGFPE (nil) false true false
9 SIGKILL (nil) false true false
10 SIGUSR1 (nil) false true false
11 SIGSEGV (nil) false true false
12 SIGUSR2 (nil) false true false
13 SIGPIPE (nil) false true false
14 SIGALRM (nil) false true false
connect/init ステートメントの後、テーブルは次のようになります。
No NAME Pointer SA_SIGINFO SIG_DFL SIG_IGN
―――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――
1 SIGHUP (nil) false true false
2 SIGINT 0x7eff9e60bdac true false false
3 SIGQUIT 0x7eff9ea17f9c true false false
4 SIGILL 0x7eff9ea17f9c true false false
5 SIGTRAP 0x7eff9ea17f9c true false false
6 SIGABRT 0x7eff9ea17f9c true false false
7 SIGBUS 0x7eff9ea17f9c true false false
8 SIGFPE 0x7eff9ea17f9c true false false
9 SIGKILL (nil) false true false
10 SIGUSR1 (nil) false true false
11 SIGSEGV 0x7eff9ea17f9c true false false
12 SIGUSR2 (nil) false true false
13 SIGPIPE 0x1 true false true
14 SIGALRM (nil) false true false
ここで、0x7eff9e60bdac は、Oracle ランタイム ライブラリで定義されている両方のシンボルを示しsslsshandler()
、0x7eff9ea17f9c を示します。skgesig_sigactionHandler()
libclntsh.so.11.1
これらの Oracle シグナル ハンドラーが非常に非決定論的な動作を導入しているように見えるため、私は懸念しています。これは、OS、ハードウェア、および segfault/abort の種類に応じて、次の動作を観察したことを意味します。
- 有用な情報があまり含まれていない見苦しいスタックトレース
- exit-status 1 でプログラムを直接終了 - コアファイルの書き込みなし、エラーメッセージなし
- exit-status 0 でプログラムを直接終了します (sic!)
特にラストの振る舞いはグロテスク。
したがって、私は興味があります:
- 動機 - これらのシグナルハンドラがオラクルによってインストールされるのはなぜですか?
- それらを無効にする方法は?-少なくともデフォルトでコアファイルを生成するシグナルの場合-私のユースケースでは、そのような状況(開発中)または本番環境での信頼性が高く有益な終了ステータスでコアが必要なため
- たとえば、Oracleシグナルハンドラを上書きしても安全
act.sa_handler = SIG_DFL; sigaction(SIGABRT, &act, 0);
ですか? - 接続後に SIGABRT/SIGSEGV とフレンドを SIG_DFL にリセットすることの欠点は何ですか?