In the following simple test code, the SIGSEGV signal handler is not called from the secondary thread, although in case if the crash is in main thread, it's called. The handler of SIGABRT signal is called in both cases. Could anyone explain why or what I am doing wrong?
#include <iostream>
#include <Windows.h>
#include <signal.h>
void signal_handler(int sig)
{
const char* name = NULL;
switch( sig )
{
case SIGABRT: name = "SIGABRT"; break;
case SIGSEGV: name = "SIGSEGV"; break;
}
std::cout << "Handler: Caught signal: " << name << std::endl;
}
void install_signal_handlers()
{
signal(SIGABRT, signal_handler);
signal(SIGSEGV, signal_handler);
std::cout << "Signal handlers are installed" << std::endl;
}
void crash()
{
//abort();
//raise(SIGSEGV);
try
{
int* ptr = NULL;
*ptr = 2;
std::cout << *ptr << std::endl;
}
catch (...)
{
std::cout << "Caught exception: " << std::endl;
}
}
DWORD WINAPI thread(LPVOID lpParameter)
{
//install_signal_handlers();
crash();
return 0;
}
int main()
{
install_signal_handlers();
//crash();
DWORD myThreadID;
HANDLE myHandle = CreateThread(0, 0, thread, 0, 0, &myThreadID);
if (myHandle == NULL)
{
std::cout << "Failed to create thread" << std::endl;
}
WaitForSingleObject(myHandle, INFINITE);
CloseHandle(myHandle);
return 0;
}