int main(int argc, char **argv) { int ret_val; struct utsname uinfo; uname(&uinfo); if (uinfo.release[0] == '2' && uinfo.release[2] == '6') maxDepth = 1; p_saved_ctxt = malloc(sizeof(ucontext_t)); setup_signal_stack(); install_signal_handler(); ret_val = getcontext(p_saved_ctxt); if(ret_val) { perror("ERROR, getcontext failed"); exit(1); } p_saved_ctxt->uc_mcontext.gregs[REG_EIP] = (int)&&safe_exit; generate_segv(1); safe_exit: printf("safe exit\n"); printSignalMask(); return 0; }
int main(int argc, char **argv) { pthread_t tid; int ret_val; void *thread_ret; int cont = 0; setup_signal_stack(); install_signal_handler(); ret_val = pthread_create(&tid, NULL, thread_start, NULL); if(ret_val) { perror("ERROR, pthread_create failed"); exit(1); } printf("created thread 0x%lx\n", (long)tid); while(!cont) { lock(); if(thread_alive == 1) cont = 1; unlock(); } ret_val = pthread_kill(tid, SIGUSR1); if(ret_val) { perror("ERROR: pthread_kill failed"); exit(1); } cont = 0; while(!cont) { lock(); if(thread_alive == 2) cont = 1; unlock(); } ret_val = pthread_kill(tid, SIGUSR1); if(ret_val) { perror("ERROR: pthread_kill failed"); exit(1); } ret_val = pthread_join(tid, NULL); if(ret_val) { perror("ERROR: pthread_join failed"); exit(1); } }