#include void *thr_routine(void *arg) { sigset_t sigset; printf("Sleeping...\n"); sleep(2); printf("Trying to generate SIGSEGV...\n"); *(char *)1 = 'a'; } void handler(int sig) { struct sigaction act; sigset_t sigset; printf("Writing core file...\n"); sigemptyset(&sigset); sigaddset(&sigset, SIGSEGV); pthread_sigmask(SIG_UNBLOCK, &sigset, NULL); signal(sig, SIG_DFL); raise(SIGSEGV); //pthread_kill(pthread_self(), SIGSEGV); printf("Shouldn't get here!\n"); } int main() { pthread_t td; pthread_attr_t attr; struct sigaction act; sigset_t sigmask; sigemptyset(&act.sa_mask); act.sa_handler = handler; act.sa_flags = 0; sigaction(SIGSEGV, &act, NULL); sigfillset(&sigmask); pthread_attr_init(&attr); // pthread_attr_setscope(&attr, PTHREAD_SCOPE_SYSTEM); pthread_create(&td, &attr, thr_routine, NULL); pthread_sigmask(SIG_SETMASK, &sigmask, NULL); pthread_join(td, NULL); return (0); }