При использовании 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 я наблюдал следующее поведение:
Особенно последнее поведение гротескно.
Таким образом, меня интересует:
act.sa_handler = SIG_DFL; sigaction(SIGABRT, &act, 0);
act.sa_handler = SIG_DFL; sigaction(SIGABRT, &act, 0);
? Компоненты обработки сигналов и диагностики: платформа диагностики OCI устанавливает обработчики сигналов, которые могут повлиять на любую обработку сигнала, которую вы используете в своем приложении. Вы можете отключить обработку сигнала OCI, установив
DIAG_SIGHANDLER_ENABLED=FALSE
в файле sqlnet.ora. Информацию см. В разделе « Диагностика неисправностей в OCI » в Руководстве программиста Oracle Call Interface .
Попробуйте настроить эту переменную среды в файле sqlnet.ora
Я бы sigaction
файл Oracle .so
чтобы заменить строку nosigactn
и сделать функцию no-op в вашей программе, называемой nosigactn
с той же сигнатурой, что и sigaction
.