/* * Exemplo de uso de threads e pilha alternativa. * Thr recebe um sinal SIGALRM e o trata na pilha alternativa. * Seria possível que outra thread trata-se um sinal na mesma pilha? */ #include #include #include #include #include void trata_SIGALRM (int sig) { psignal(sig, "Início"); printf("%p\n", (void*) &sig); psignal(sig, "Fim "); } void* f_thread(void *v) { sigset_t unblock_sigalrm; sigemptyset (&unblock_sigalrm); sigaddset (&unblock_sigalrm, SIGALRM); pthread_sigmask (SIG_UNBLOCK, &unblock_sigalrm, NULL); pause(); /* sigsuspend seria melhor? */ printf("Thread %p\n", (void *) &v); return NULL; } int main (void) { stack_t pilha; struct sigaction act; sigset_t block_sigalrm; pthread_t thr; pilha.ss_size = 3*SIGSTKSZ; pilha.ss_sp = malloc(pilha.ss_size); pilha.ss_flags = 0; if (sigaltstack (&pilha, NULL) == -1) { perror("sigaltstack"); return 0; } act.sa_handler = trata_SIGALRM; sigemptyset(&act.sa_mask); act.sa_flags = SA_ONSTACK; sigaction(SIGALRM, &act, NULL); pthread_create(&thr, NULL, f_thread, NULL); sigemptyset(&block_sigalrm); sigaddset (&block_sigalrm, SIGALRM); sigprocmask (SIG_BLOCK, &block_sigalrm, NULL); alarm(2); pthread_join(thr, NULL); return 0; }