Quando si utilizza Pro * C (un preprocessore SQL incorporato da Oracle per C-Code) o OCI, ho notato che la routine connect/init installa alcuni gestori di segnale.Oracle Pro * C/OCI installa gestori per SIGSEGV/SIGABRT e amici - perché e come disabilitare?
questo significa che prima un
EXEC SQL CONNECT :username IDENTIFIED BY :password USING :dbspec ;
o un
OCIEnvNlsCreate()
posso verificare che ad esempio quei segnali hanno seguenti gestori:
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
Dopo l'istruzione/init connect la tabella è simile a:
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
dove 0x7eff9e60bdac denota sslsshandler()
e 0x7eff9ea17f9c denota skgesig_sigactionHandler()
- entrambi i simboli definiti nella libclntsh.so.11.1
- la libreria di runtime di Oracle.
Sono preoccupato per questi gestori di segnale Oracle perché sembra che introducano un comportamento non deterministico. Ciò significa che a seconda del sistema operativo, l'hardware e il tipo di segfault/abortire ho osservato seguente comportamento:
- una brutta stacktrace che non contiene molte informazioni utili
- all'uscita del programma direttamente con uscita-status 1 - senza qualsiasi scrittura del file core e nessun messaggio di errore
- all'uscita del programma direttamente con uscita-stato 0 (sic!)
Specialmente l'ultimo comportamento è grottesca.
Così, Sono interessato a:
- la motivazione - perché sono quei gestori di segnali installati da parte di Oracle?
- come disabilitarli? - almeno per i segnali che generano un file core di default - perché per il mio caso d'uso voglio un core in queste circostanze (durante lo sviluppo) o uno stato di uscita affidabile e informativo nella produzione
- è sicuro sovrascrivere il segnale Oracle -handler via es
act.sa_handler = SIG_DFL; sigaction(SIGABRT, &act, 0);
? - Quali sono gli svantaggi di reimpostare SIGABRT/SIGSEGV e gli amici su SIG_DFL dopo la connessione?
migliore soluzione sarebbe quella di non usare buggy, il software non-thread-safe come Oracle. –