void handler_usr(int signo, siginfo_t *info, void *uc)
{ int ret;
/* *Breakoutofinfiniterecursioncausedbyraise(SIGUSR1)invoked *frominsidethehandler
*/
++cnt; if (cnt > 1) return;
/* SEGV blocked during handler execution, delivered on return */ if (raise(SIGSEGV))
ksft_exit_fail_perror("raise");
ksft_print_msg("SEGV bypassed successfully\n");
/* *Signalresponsibleforhandlerinvocationisblockedbydefault; *deliveredonreturn,leadingtorecursion
*/ if (raise(SIGUSR1))
ksft_exit_fail_perror("raise");
ksft_test_result(cnt == 1, "USR1 is blocked, cannot invoke handler right now\n");
/* Raise USR1 again; only one instance must be delivered upon exit */ if (raise(SIGUSR1))
ksft_exit_fail_perror("raise");
/* SEGV has been blocked in sa_mask, but ucontext is empty */
ret = sigismember(&(((ucontext_t *)uc)->uc_sigmask), SIGSEGV);
ksft_test_result(ret == 0, "SEGV not blocked in ucontext\n");
/* USR1 has been blocked, but ucontext is empty */
ret = sigismember(&(((ucontext_t *)uc)->uc_sigmask), SIGUSR1);
ksft_test_result(ret == 0, "USR1 not blocked in ucontext\n");
/* *Mangleucontext;thiswillbecopiedbackinto¤t->blocked *onreturnfromthehandler.
*/ if (sigaddset(&((ucontext_t *)uc)->uc_sigmask, SIGUSR2))
ksft_exit_fail_perror("sigaddset");
}
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.