/* * Tentativa de bloqueio para tratadores encadeados. */ #include #include #include #include void tratador_generico(int sig) { sigset_t mascara_bloqueio, mascara_anterior; sigfillset (&mascara_bloqueio); sigprocmask (SIG_BLOCK, &mascara_bloqueio, &mascara_anterior); psignal(sig, "Início"); psignal(sig, "Fim "); sigprocmask (SIG_SETMASK, &mascara_anterior, NULL); } void tratador_SIGUSR2(int sig) { sigset_t mascara_bloqueio, mascara_anterior; sigfillset (&mascara_bloqueio); sigprocmask (SIG_BLOCK, &mascara_bloqueio, &mascara_anterior); psignal(sig, "Início"); raise(SIGUSR1); psignal(sig, "Fim "); sigprocmask (SIG_SETMASK, &mascara_anterior, NULL); } int main (void) { signal (SIGUSR1, tratador_generico); signal (SIGUSR2, tratador_SIGUSR2); raise(SIGUSR2); sleep(2); return 0; }