Я пытаюсь переместить обработчик сигнала в поток (чтобы я мог использовать мьютекс). Я нашел несколько страниц, таких как this , которые описывают, что я должен делать, однако при попытке обработчик сигнала никогда не срабатывает.
Вот мой обработчик:
{
int status;
// Block current thread from trapping signal:
sigset_t sigSet;
sigemptyset(&sigSet);
sigaddset(&sigSet, SIGSEGV);
status = pthread_sigmask( SIG_BLOCK, &sigSet, NULL);
dbgassert(status == 0);
// create thread to capture signal
status = pthread_create(&signalThread, NULL, signalThreadFn, NULL);
dbgassert(status == 0);
sleep(1);
debugf("about to die");
// generate segv:
rt = posix_memalign((void **)&pool, getpagesize(), getpagesize());
dbgassert(rt==0);
mprotect(pool, getpagesize(), PROT_READ);
pool[0]=10;
debugf("resurected!!!");
}
static void *
signalThreadFn(void *parm) {
sigset_t sigSet;
int sig;
siginfo_t sigInfo = {};
debugf("Starting signal thread");
sigemptyset(&sigSet);
sigaddset(&sigSet, SIGSEGV);
while( 1 ) {
debugf("waiting for SIGSEGV...");
sig=sigwaitinfo(&sigSet,&sigInfo);
debugf("Got signal %d",sig);
...
}
}
но поток никогда не фиксирует сигнал. Я получаю на выходе:
DEBUG [signalThreadFn.841]: waiting for SIGSEGV...
DEBUG [constructor.240]: about to die
Segmentation fault (core dumped)
Я не уверен, почему обработчик сигнала не перехватывает сигнал. Из того, что я понимаю, дочерний поток должен наследовать маску от своего родителя, и поскольку SIGSEGV был отключен, ни один не должен перехватывать сигнал, пока поток не выполнит свою sigwaitinfo - почему дочерний процесс не перехватывает сигнал?