Al usar Pro*C (un preprocesador de SQL incorporado de Oracle para C-Code) u OCI, noté que la rutina connect/init instala algunos controladores de señal.
Eso significa ante un
EXEC SQL CONNECT :username IDENTIFIED BY :password USING :dbspec ;
o un
OCIEnvNlsCreate()
Puedo verificar que, por ejemplo, esas señales tienen los siguientes controladores:
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
Después de la instrucción connect/init, la tabla se ve así:
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
donde 0x7eff9e60bdac denota sslsshandler()
y 0x7eff9ea17f9c denota skgesig_sigactionHandler()
– ambos símbolos definidos en libclntsh.so.11.1
– la biblioteca de tiempo de ejecución de Oracle.
Me preocupan esos manejadores de señales de Oracle porque parece que introducen un comportamiento bastante no determinista. Eso significa que, según el sistema operativo, el hardware y el tipo de error de segmento/aborto, he observado el siguiente comportamiento:
- un stacktrace feo que no contiene mucha información útil
- salida directa del programa con exit-status 1 – sin escribir ningún archivo central y sin mensaje de error
- salida directa del programa con exit-status 0 (¡sic!)
Especialmente el último comportamiento es grotesco.
Por lo tanto, estoy interesado en:
- la motivación: ¿por qué Oracle instala esos controladores de señal?
- como desactivarlos? – al menos para señales que producen un archivo central de forma predeterminada – porque para mi caso de uso quiero un núcleo en esas circunstancias (durante el desarrollo) o un estado de salida confiable e informativo en producción
- ¿Es seguro sobrescribir el controlador de señales de Oracle a través de, por ejemplo?
act.sa_handler = SIG_DFL; sigaction(SIGABRT, &act, 0);
? - ¿Cuáles son las desventajas de restablecer SIGABRT/SIGSEGV y amigos a SIG_DFL después de conectarse?
La mejor solución sería no usar software con errores y no seguro para subprocesos como Oracle.
– R.. GitHub DEJA DE AYUDAR A ICE
15 de junio de 2013 a las 15:24