2012-01-19 39 views
5

Đây là mã mà tôi đặt trình xử lý của mình cho tín hiệu SIGABRT sau đó tôi gọi abort() nhưng trình xử lý không được xử lý, thay vào đó chương trình bị hủy bỏ, tại sao?Làm thế nào để xử lý tín hiệu 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; 
} 

CHƯƠNG TRÌNH OUTPUT:

enter image description here

+0

trình hoàn hảo ở đây, sau khi tôi bao gồm ''. Nền tảng nào? –

+0

Windows 7 x64 với MSVC++ 2010 (không cần bao gồm cstdlib trong studio trực quan) – codekiddy

+1

Vâng, chương trình sẽ bị hủy bỏ trừ khi trình xử lý tín hiệu thực hiện 'longjmp'. Nếu bạn muốn thông báo được in trước đó, bạn có thể muốn xóa 'std :: cout' (hoặc ghi vào' std :: cerr'). –

Trả lời

11

Như những người khác đã nói, bạn không thể hủy bỏ() trả lại và cho phép thực hiện tiếp tục bình thường. Tuy nhiên, những gì bạn có thể làm là bảo vệ một đoạn mã có thể gọi là hủy bỏ bởi một cấu trúc giống như việc thử bắt. Việc thực thi mã sẽ bị hủy bỏ nhưng phần còn lại của chương trình có thể tiếp tục. Đây là một bản demo:

#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

Dường như câu trả lời này chưa hoàn thành. Chú thích: ? – stanm

6

Mặc dù bạn có thể thay thế handler cho SIGABRTabort() sẽ chú ý đến việc xử lý, việc hủy bỏ chỉ ức chế nếu xử lý tín hiệu không trả lại. Các báo giá có liên quan trong C99 là trong 7.20.4.1 đoạn 2:

Chức năng hủy bỏ gây ra sự kết thúc chương trình bất thường xảy ra, trừ khi tín hiệu SIGABRT bị bắt và bộ xử lý tín hiệu không quay trở lại. ...

Trình xử lý tín hiệu của bạn quay trở lại và do đó chương trình bị hủy.

+0

Vì vậy, bạn đang nói rằng try_and_catch_abort ở trên sẽ chỉ hoạt động trong chế độ gỡ lỗi chứ không phải cho mã được phát hành? – Michele

2

Bạn nhận được các triệu chứng đó là hộp thoại gỡ lỗi bật lên, khi bạn có bản dựng gỡ lỗi (có cửa sổ và Visual Studio- Tôi đang thử nghiệm với phiên bản 2012), vì nó đặt ngắt lỗi , trong việc thực hiện gỡ lỗi hủy bỏ()). Nếu bạn chọn "phớt lờ" bạn nhận được thông điệp "Chức năng triger"

Nếu bạn làm một phát hành xây dựng, sau đó bạn không nhận được hộp thoại debug popup, và bạn nhận được thông báo, như mong đợi

Các vấn đề liên quan