2011-08-07 9 views
5

वहाँ समाप्ति पर कोड को चलाने के लिए किसी तरह किस तरह समाप्ति (असामान्य, सामान्य, न आया हुआ अपवाद आदि) है, कोई फर्क नहीं पड़ता? मैं अपने वास्तव में जावा में संभव है, लेकिन यह सी ++ में भी संभव है? मैं एक विंडोज वातावरण मान रहा हूँ।शटडाउन हुक C++

+2

जावा में यह संभव नहीं है - भाषा के बावजूद सभी प्रक्रियाएं लिनक्स (और विंडोज़ के समतुल्य) पर सिग्नल-9 नहीं पकड़ सकती हैं या उस सिग्नल आने पर कोई कोड चलाते हैं – Soren

+0

जैसा कि @ ड्रेक ने सुझाव दिया था, मैं [ atexit] (http://www.cplusplus.com/reference/cstdlib/atexit/)। –

उत्तर

5

नहीं - यदि किसी TerminateProcess invokes, अपनी प्रक्रिया आगे adieu बिना (विशेष रूप से) में किसी भी अधिक कोड को चलाने के लिए कोई मौका बिना नष्ट हो जाएगा, और बंद करने की प्रक्रिया।

+1

यह सही जवाब है; तथापि के रूप में अन्य उत्तर, आप सेटअप एक निकास-हैंडलर atexit (का उपयोग करते हुए ') कर सकते हैं' और आप 'संकेत()' का उपयोग कर सबसे संकेत पकड़ कर सकते हैं में से कुछ ने संकेत दिया - लेकिन आप कोई भी कदम कभी नहीं ले जा सकते हैं यदि किसी समाप्ति बलों (कि लिनक्स पर मारने-9 किया जाएगा, और संकेत 9 uncatchable है) – Soren

+0

धन्यवाद, वास्तव में मैं कि answere – Paranaix

+0

भी से डर लगता था: ज़ोर(), गर्भपात(), समाप्त() –

2

सामान्य समापन applciation के लिए मेरा सुझाव है

atexit() 
1

एक अच्छा समस्या दृष्टिकोण रास्ता सी ++ आरए II मुहावरा है, जो यहाँ का मतलब है कि सफाई के संचालन एक वस्तु का नाशक में रखा जा सकता है, यानी

class ShutdownHook { 
    ~ShutdownHook() { 
    // exit handler code 
    } 
}; 

int main() { 
    ShutdownHook h; 
    //... 
} 

उपयोग कर रहा है ऐस पुस्तकालय में Object Lifetime Manager देखें। लिंक किए गए दस्तावेज़ पर, वे atexit फ़ंक्शन के बारे में भी चर्चा करते हैं।

समाप्ति के किसी भी प्रकार के लिए
+0

से ऊपर मैं मान लिया है कि बाहर निकलने के "सामान्य है ", यानी उदाहरण के माध्यम से नहीं 'निकास() 'कॉल, या सेगमेंटेशन गलती के कारण, आदि –

+1

सावधान। यह काम करने की गारंटी नहीं है। यदि कोई अपवाद मुख्य() से बच निकलता है तो कार्यान्वयन में यह परिभाषित किया जाता है कि स्टैक अवांछित है या नहीं। इस प्रकार इस काम की गारंटी के लिए आपको मुख्य() में सभी अपवादों को पकड़ना होगा (कोशिश कोड में अपना कोड डालना)। आपको कुछ भी करने की ज़रूरत नहीं है, बस अपवाद को फिर से उखाड़ फेंक दें। –

0

नहीं है; ऐसे संकेत हैं जिन्हें लिनक्स पर किल की तरह संभालने के लिए डिज़ाइन नहीं किया गया है।

ये सिग्नल एक प्रोग्राम को समाप्त करने के लिए डिज़ाइन किए गए हैं जो सभी मेमोरी, या सीपीयू, या कुछ अन्य संसाधनों का उपभोग कर चुके हैं, और कंप्यूटर को ऐसे राज्य में छोड़ दिया है जो एक हैंडलर फ़ंक्शन चलाने में मुश्किल बनाता है।

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