При использовании Pro * C (встроенный препроцессор SQL от Oracle для C-Code) или OCI я заметил, что процедура подключения / инициализации устанавливает некоторые обработчики сигналов.
Это означает, что перед
EXEC SQL CONNECT :username IDENTIFIED BY :password USING :dbspec ;
or a
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?
- как их отключить? - по крайней мере, для сигналов, которые по умолчанию выдают основной файл - потому что для моего варианта использования мне нужно ядро при этих обстоятельствах (во время разработки) или надежный и информативный статус выхода в производстве
- безопасно ли перезаписывать обработчик сигналов Oracle, например,
act.sa_handler = SIG_DFL; sigaction(SIGABRT, &act, 0);
? - каковы недостатки сброса SIGABRT / SIGSEGV и друзей на SIG_DFL после подключения?