È qualcosa che il kernel sta facendo per noi. Puoi trovare tutte le informazioni leggendo il file signal.c
nei sorgenti del kernel.
Il punto in cui kernel sta cercando di trovare un gestore di segnale registrato comincia qui: http://lxr.free-electrons.com/source/kernel/signal.c#L2257
2257 ka = &sighand->action[signr-1];
2258
2259 /* Trace actually delivered signals. */
2260 trace_signal_deliver(signr, &ksig->info, ka);
2261
2262 if (ka->sa.sa_handler == SIG_IGN) /* Do nothing. */
2263 continue;
2264 if (ka->sa.sa_handler != SIG_DFL) {
2265 /* Run the handler. */
2266 ksig->ka = *ka;
2267
2268 if (ka->sa.sa_flags & SA_ONESHOT)
2269 ka->sa.sa_handler = SIG_DFL;
2270
2271 break; /* will return non-zero "signr" value */
2272 }
Quindi, se c'è un gestore di segnale e se non lo è "ignore segnale" (SIG_IGN
) e se è non il gestore "predefinito" (SIG_DEF
), il kernel lo contrassegnerà semplicemente per essere eseguito (e, a seconda che sia di tipo unico, sposterà nuovamente il gestore sul gestore predefinito).
Tuttavia, se non c'è gestore di segnale registrato, o se si tratta di SIG_DEF
, kernel controlla se magari ha bisogno di mettere in pausa il processo, e, infine, kernel stati i seguenti:
2330 /*
2331 * Anything else is fatal, maybe with a core dump.
2332 */
http://lxr.free-electrons.com/source/kernel/signal.c#L2330
fonte
2015-09-17 08:52:08
Ulteriori domande - "SE" Fornisco il mio gestore personalizzato? Chi eseguirà il codice nel gestore personalizzato? La logica verrà eseguita dal sistema operativo nell'anello 0 o nell'anello 3? – bawejakunal
@bawejakunal: verrà eseguito nell'anello 3. Fare altrimenti sarebbe un pericolo per la sicurezza completo. – 3442