С++ три точки не ловят сегментейшен фаулт.
#include <signal.h>
#include <string.h>
#include <stdio.h>
void SigSegv( int )
{
printf( "SIGSEGV\n" );
throw;
}
int main( int argc, char** argv )
{
struct sigaction sa;
memset( &sa, 0, sizeof( sa ) );
sa.sa_handler = &SigSegv;
sigaction( SIGSEGV, &sa, 0 );
char* ptr = 0;
try
{
*ptr = 1;
}
catch(...)
{
printf( "Exeption\n" );
}
return 0;
}
---
Если не устанавливать SigSegv( int ) в качестве обработчика прерывания, то получим Segmentation fault.
1. Можно ли заставить компилятор строить программу так, что бы catch(...) ловила такой системный эксепшн ?
При установки SigSegv( int ) в качестве обработчика прерывания, и throw в нем, получим Aborted
2. Как заставить программу возвращаться в catch ? (это самое важное !, без этого весь порт из под виндов гроша ломанного не стоит.)
Если throw закомментарить, то получим зацикливание (вечно выводиться SIGSEGV), такое впечатление, что после выхода из обработчика выполняется команда вызвавшая исключение (которая его вызовет снова).
3. Как сделать, что бы после обработки сигнала SIGSEGV выполнение программы продолжалось со следующей за вызвавшей исключение команды ?
Может использовать какие нибудь другие RT библиотеки или даже сменить компилятор (сейчас используется g++ (gcc version 2.96 20000731 (Red Hat Linux 7.1 2.96-98)))?
|