#include #include #include volatile static int xx=7; void SHandler(int sig) { xx++; pthread_exit((void*)xx); return; } void* Thread1(void *arg) { struct sigaction actions; int *a=0; memset(&actions, 0, sizeof(actions)); sigemptyset(&actions.sa_mask); sigaddset(&actions.sa_mask, SIGSEGV); sleep(1); actions.sa_handler = SHandler; actions.sa_flags = 0; if (sigaction(SIGSEGV,&actions, NULL)) printf("Sigaction ERROR !!!, errno = %d\n", errno); else printf("Sigaction success, errno = %d\n", errno); sleep(5); // induce SIGSEGV... *a=5; } void* OKThread(void *arg) { sleep(30); } static void printrc( char *name, int rc) { printf("%-20s ---> Result: %d, xx=%d\n", name, rc, xx); } int main() { pthread_t tid,tid2; int rc; printf("Starting SIGSEGV1...\n"); pthread_create(&tid, NULL, Thread1, (void*)1); printf("tid1=%x\n", tid); while (pthread_kill(tid, 0) !=ESRCH) sleep(1); printrc("Join1",pthread_join(tid,(void**)&rc)); printrc("Ret. value", rc); printrc("Good thread create",pthread_create(&tid, NULL, OKThread, NULL)); printf("Starting SIGSEGV2...\n"); pthread_create(&tid2, NULL, Thread1, (void*)2); printf("tid2=%x\n", tid2); while (pthread_kill(tid2, 0) !=ESRCH) sleep(1); printf("xx=%d\n",xx); printrc("Join2",pthread_join(tid2,(void**)&rc)); printrc("Ret. value", rc); return 0; }