12

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 にリセットすることの欠点は何ですか?
4

2 に答える 2