Oracle Pro * C / OCI устанавливают обработчики для SIGSEGV / SIGABRT и друзей – почему и как отключить?

При использовании Pro * C (встроенный SQL-препроцессор от Oracle для C-Code) или 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 обозначает sslsshandler() и 0x7eff9ea17f9c обозначает skgesig_sigactionHandler() – оба символа, определенные в libclntsh.so.11.1 – библиотеке времени выполнения Oracle.

Меня беспокоят эти обработчики сигналов Oracle, потому что кажется, что они вносят довольно не детерминированное поведение. Это означает, что в зависимости от ОС, оборудования и вида segfault / abort я наблюдал следующее поведение:

  • уродливый стек, который не содержит много полезной информации
  • прямой выход программы с статусом выхода 1 – без записи основного файла и без сообщения об ошибке
  • прямой выход программы с статусом выхода 0 (sic!)

Особенно последнее поведение гротескно.

Таким образом, меня интересует:

  • мотивация – почему эти обработчики сигналов установлены Oracle?
  • как их отключить? – по крайней мере, для сигналов, которые дают основной файл по умолчанию, – потому что для моего случая использования я хочу, чтобы kernel ​​при таких обстоятельствах (во время разработки) или надёжный и информативный статус выхода в производство
  • безопасно ли перезаписывать обработчик сигналов Oracle, например, act.sa_handler = SIG_DFL; sigaction(SIGABRT, &act, 0); act.sa_handler = SIG_DFL; sigaction(SIGABRT, &act, 0); ?
  • Каковы недостатки перезагрузки SIGABRT / SIGSEGV и друзей SIG_DFL после подключения?

Компоненты обработки сигналов и диагностики: платформа диагностики OCI устанавливает обработчики сигналов, которые могут повлиять на любую обработку сигнала, которую вы используете в своем приложении. Вы можете отключить обработку сигнала OCI, установив

 DIAG_SIGHANDLER_ENABLED=FALSE 

в файле sqlnet.ora. Информацию см. В разделе « Диагностика неисправностей в OCI » в Руководстве программиста Oracle Call Interface .

Попробуйте настроить эту переменную среды в файле sqlnet.ora

Я бы sigaction файл Oracle .so чтобы заменить строку nosigactn и сделать функцию no-op в вашей программе, называемой nosigactn с той же сигнатурой, что и sigaction .