#include <signal.h>
#include <string.h>
#include <stdio.h>
#include <setjmp.h>
jmp_buf jb;
void
SigSegv( int ) {
printf( "SIGSEGV\n" );
longjmp(&jb, 1);
}
int
main( int argc, char** argv ) {
struct sigaction sa;
int iter = 0;
memset( &sa, 0, sizeof( sa ) );
sa.sa_handler = &SigSegv;
sigaction( SIGSEGV, &sa, 0 );
if (setjmp(&jb)) {
printf("SIGSEGV catched, iteration %d\n", iter);
if (iter == 2)
return -1;
}
switch(iter++) {
case 0:
*((int *)NULL) = 0;
case 1:
((void(*)(void))0)();
}
return 0;
}
---
Только лучше ставить setjmp поближе к тому месту, где возможен фаулт, потому как стек не сворачивается, как в случае с throw, а просто переставляется esp/eip и все остарльное. И все ресурсы, ссылки на которые были в локальных переменных станут ликами. Нужно хранить их или глобально или статически или вообще избежать.
|