2012-01-19 3 views
5

여기에 SIGABRT 신호에 대한 처리기를 설정 한 코드가 있는데 abort()을 호출하지만 처리기가 trigered되지 않고 대신 프로그램이 중단됩니다. 그 이유는 무엇입니까?SIGABRT 신호를 처리하는 방법은 무엇입니까?

#include <iostream> 
#include <csignal> 
using namespace std; 
void Triger(int x) 
{ 
    cout << "Function triger" << endl; 
} 

int main() 
{ 
    signal(SIGABRT, Triger); 
    abort(); 
    cin.ignore(); 
    return 0; 
} 

프로그램 출력은 : 당신이 핸들러에주의를 지불 SIGABRTabort()에 대한 핸들러를 대체 할 수 있지만

enter image description here

+0

작품을 예상대로는 메시지가 여기에 ''이 포함 된 후. 어떤 플랫폼? –

+0

MSVC++ 2010이 설치된 Windows 7 x64 (Visual Studio에 cstdlib를 포함 할 필요가 없음) – codekiddy

+1

신호 처리기가 'longjmp'를 수행하지 않으면 프로그램을 중단해야합니다. 그 전에 메시지를 출력하고 싶다면,'std :: cout'을 플러시 (또는'std :: cerr'에 쓰기)하고 싶을 것이다. –

답변

11

다른 사람들도 말했듯이 abort()를 반환하여 실행을 정상적으로 계속할 수는 없습니다. 그러나 할 수있는 일은 try catch와 유사한 구조에 의해 중단 될 수있는 코드 조각을 보호하는 것입니다. 코드 실행이 중단되지만 나머지 프로그램은 계속 진행될 수 있습니다. 이 디버그 휴식을 설정 한 이후 (창 및 Visual Studio- I 2012 버전으로 테스트하고 있습니다로) 디버그 빌드가있을 때

#include <csetjmp> 
#include <csignal> 
#include <cstdlib> 
#include <iostream> 

jmp_buf env; 

void on_sigabrt (int signum) 
{ 
    longjmp (env, 1); 
} 

void try_and_catch_abort (void (*func)(void)) 
{ 
    if (setjmp (env) == 0) { 
    signal(SIGABRT, &on_sigabrt); 
    (*func)(); 
    } 
    else { 
    std::cout << "aborted\n"; 
    } 
}  

void do_stuff_aborted() 
{ 
    std::cout << "step 1\n"; 
    abort(); 
    std::cout << "step 2\n"; 
} 

void do_stuff() 
{ 
    std::cout << "step 1\n"; 
    std::cout << "step 2\n"; 
}  

int main() 
{ 
    try_and_catch_abort (&do_stuff_aborted); 
    try_and_catch_abort (&do_stuff); 
} 
+0

이 답변이 완료되지 않은 것 같습니다. 노트: ? – stanm

6

의 중단은 신호 처리기는 반환하지 않는 경우에만 억제된다. 신호 SIGABRT가 적발되고 있으며, 신호 처리기는 반환하지 않습니다하지 않는 한

강제 종료 기능이 비정상적인 프로그램 종료 발생 원인 : C99의 관련 인용 7.20.4.1 조 제 2 항에있다. ...

신호 처리기가 돌아오고 프로그램이 중단됩니다.

+0

위의 try_and_catch_abort가 릴리스 된 코드가 아닌 디버그 모드에서만 작동한다는 것을 알 수 있습니까? – Michele

2

당신은, 그 증상이 팝업 디버그 대화 상자를 즉 얻을 : 여기 데모입니다 , abort()의 디버그 구현에서). 당신이 그 메시지 "기능 triger"

을 얻을 "무시"선택 경우 릴리스 빌드를 할 경우에, 당신은 디버그 팝업 대화 상자를 얻을하지 않습니다 완벽

관련 문제