LINUX.ORG.RU

Продолжим про исключения!!


0

0

Могу ли я бросить исключение из обработчика сигнала SIGSEGV так напримет( пример не работает поэтому и спрашиваю )
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <signal.h>
//#include <bits/sigaction.h>
#include <ucontext.h>


#include <iostream>

using namespace std;
//typedef void (*sa_sigaction)(int, siginfo_t *, void *);

void sigsegv_handler( int f_Sig, siginfo_t* f_SigInfo, void* f_Context )
{
cout << "PID = " << getpid() << endl;
std::cerr << "Segmentation violation " << std::endl;
throw 62;
}
int main( int ac, char* av[] )
{
struct sigaction snew;
struct sigaction sold;

snew.sa_sigaction = sigsegv_handler;
sigemptyset( &snew.sa_mask );
snew.sa_flags = SA_SIGINFO;

if( sigaction( SIGSEGV, &snew, &sold ) < 0 ){
std::cerr << "Set signal routine is faled."<< std::endl;
return 1;
}
else {
try{
cout << "PID = " << getpid() << endl;
(*( int* )0 ) = 0;
}
catch( int i ){
std::cerr << i << std::endl;
}
catch(...){
std::cerr << "To caught exception.." << std::endl;
}
}
sigaction( SIGSEGV, &sold, &snew );
return 0;
}

★★

Ответ на: комментарий от alexsy

ytfyt

мне кажется Ян хотел сказать, что\ 1) аппаратные исключения (следствием какового и является получение процессом SIGSEGV) не имеют никакого отношения к исключениям C++

2)SEH это windows-specific feature

3) вопрос часто обсасывался (см например флейм на qnx.org.ru) и вообще поиск рулит.

int_0dh
()

Наверное, можешь - если поиграть с опциями (-fnon-call-exceptions, -fasyncronous-unwind-tables), но это непереносимо. Да и зачем это нужно вообще?

tailgunner ★★★★★
()
Ответ на: комментарий от alexsy

А чего не понятно-то? Код, который передает управление обработчику сигнала, ничего не знает ни про какие C++ exceptions.

cobold ★★★★★
()

На кой вообще эти с++ исключения?
назвали бы их как-нить по-другому

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.