2012-01-19 15 views
5

यहां कोड है जिस पर मैंने SIGABRT सिग्नल के लिए अपना हैंडलर सेट किया है, तो मैं abort() पर कॉल करता हूं लेकिन हैंडलर ट्रिगर नहीं होता है, बल्कि प्रोग्राम निरस्त हो जाता है, क्यों?एसआईजीएबीआरटी सिग्नल को कैसे संभालें?

#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; 
} 

कार्यक्रम उत्पादन:

enter image description here

+0

निर्माण पूरी तरह से आप संदेश मिलता है, यहां, '' शामिल करने के बाद। कौन सा प्लेटफ़ॉर्म? –

+0

एमएसवीसी ++ 2010 के साथ विंडोज 7 एक्स 64 (विजुअल स्टूडियो में सीएसटीडीआईबीबी शामिल करने की आवश्यकता नहीं है) – codekiddy

+1

ठीक है, प्रोग्राम को तब तक निरस्त किया जाना चाहिए जब तक कि सिग्नल हैंडलर 'longjmp' नहीं करते। अगर आप इससे पहले संदेश मुद्रित करना चाहते हैं, तो आप 'std :: cout' (या 'std :: cerr'' पर लिखना चाहेंगे। –

उत्तर

11

जैसा कि अन्य ने कहा है, आप निरस्त() वापसी नहीं कर सकते हैं और निष्पादन को सामान्य रूप से जारी रखने की अनुमति नहीं दे सकते हैं। हालांकि आप क्या कर सकते हैं कोड के एक टुकड़े की रक्षा है जो एक कोशिश के रूप में एक संरचना द्वारा abort कॉल कर सकते हैं। कोड का निष्पादन निरस्त कर दिया जाएगा लेकिन शेष कार्यक्रम जारी रख सकता है। यहाँ एक डेमो है:

#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 और abort() के लिए हैंडलर की जगह हैंडलर पर ध्यान देना होगा कर सकते हैं, बीच में बंद करें केवल संकोची यदि संकेत हैंडलर वापस नहीं करता है।

बीच में बंद करें समारोह, का कारण बनता है असामान्य कार्यक्रम समाप्ति होने के लिए जब तक कि संकेत SIGABRT पकड़ा जा रहा है और संकेत हैंडलर वापस नहीं करता है: C99 में प्रासंगिक उद्धरण 7.20.4.1 पैरा 2 में है। ...

आपका सिग्नल हैंडलर वापस आ जाता है और इस प्रकार कार्यक्रम निरस्त हो जाता है।

+0

तो आप कह रहे हैं कि try_and_catch_abort उपरोक्त केवल डीबग मोड में काम करेगा, न कि जारी कोड के लिए? – Michele

2

आप, उन लक्षण यानी पॉपअप डीबग डायलॉग मिलता है जब आप एक डीबग बिल्ड (विंडोज़ और दृश्य स्टूडियो मैं 2012 संस्करण के साथ परीक्षण कर रहा हूँ के साथ) है, क्योंकि यह सेट एक डिबग ब्रेक , abort() के डीबग कार्यान्वयन में)। आप चुनते हैं तो "अनदेखा" आप उस संदेश "समारोह triger"

मिल आप एक रिलीज निर्माण करते हैं, तो आप डिबग पॉपअप संवाद नहीं मिलता है, और अपेक्षा के अनुरूप

संबंधित मुद्दे