To coś, co robi dla nas jądro. Możesz znaleźć wszystkie informacje czytając plik signal.c
w źródłach jądra.
Punkt, w którym jądro próbuje znaleźć zarejestrowaną obsługi sygnału zaczyna się tutaj: 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 }
Tak więc, jeśli nie ma obsługi sygnału, a jeśli nie jest to „sygnał zignorować” (SIG_IGN
), a jeśli jest to nie "domyślny" handler (SIG_DEF
), jądro po prostu oznaczy go jako uruchamiany (i w zależności od tego, czy jest to jednorazowe przejście, ponownie przeniesie program obsługi do domyślnego programu obsługi).
Jednakże, jeśli nie ma obsługi sygnału zarejestrowany, lub jeżeli jest to SIG_DEF
kontrole jądra, czy może ona potrzebuje, aby wstrzymać proces i wreszcie jądra stwierdza co następuje:
2330 /*
2331 * Anything else is fatal, maybe with a core dump.
2332 */
http://lxr.free-electrons.com/source/kernel/signal.c#L2330
Więcej pytania - "JEŻELI" Dostarczam własny niestandardowy przewodnik? Kto wykona kod w niestandardowej funkcji obsługi? Czy logika zostanie wykonana przez system operacyjny w pierścieniu 0 lub proces w pierścieniu 3? – bawejakunal
@bawejakunal: Zostanie wykonany w pierścieniu 3. Inaczej stanowiłoby to pełne zagrożenie bezpieczeństwa. – 3442