2010-09-09 27 views
23

मुझे दो के बीच अंतर पता है। एक उल्लेखनीय बात यह है कि abort() SIGABRT सिग्नल भेजता है, इसलिए यह तब प्रासंगिक हो सकता है जब आपका सॉफ़्टवेयर उन पर निर्भर करता है। लेकिन एक सामान्य अनुप्रयोग निकास() के लिए abort() ... के अधिक सुरक्षित संस्करण प्रतीत होता है? बाहर निकलने के बजाय abort() का उपयोग करने के लिए कोई अन्य चिंताएं हैं?जब निरस्त() को निकास() पर प्राथमिकता दी जाती है?

उत्तर

31

abort का उपयोग करते हुए कोर डंप हो जाएगा, यदि उपयोगकर्ता कोर डंप सक्षम किया गया है। तो अंगूठे के नियम के रूप में, मैं abort का उपयोग करता हूं यदि आप गलत होने के बारे में अनिश्चित हैं कि इसके बारे में उपयोगी जानकारी प्राप्त करने का एकमात्र तरीका कोर डंप का विश्लेषण करना है।

यदि आप किसी दिए गए बिंदु से exit सुरक्षित रूप से सुरक्षित कर सकते हैं, और कोर डंप की आवश्यकता नहीं है, तो बाहर निकलें एक अच्छा दृष्टिकोण है।

+1

यह भी अच्छी बात है +1 – doc

+2

मैं इसे फिर से बदल दूंगा: क्या आप अपने उपयोगकर्ताओं को कोर डंप का विश्लेषण करने की उम्मीद कर रहे हैं? यदि नहीं, तो निरस्तक का उपयोग न करें। (ध्यान रखें कि यद्यपि डेवलपर कोर डंप चाहता है, लेकिन आपके उपयोगकर्ता शायद नहीं कर सकते हैं। तो शायद अपरिवर्तनीय केवल आपके निष्पादन योग्य के "डीबग" संस्करण में उपयोग किया जाना चाहिए।) –

+0

@ केन साइमन: यदि उपयोगकर्ता कोर नहीं चाहते हैं डंप, वे उन्हें बंद कर सकते हैं (ulimit -c 0)। मुझे लगता है कि उबंटू डिफ़ॉल्ट रूप से ऐसा करता है। – camh

8

कभी-कभी आपका प्रोग्राम इस हद तक टूट जाता है कि उसका राज्य असंगत हो जाता है और इसलिए exit() काम नहीं करेगा क्योंकि इससे वैश्विक वस्तुओं का विनाश हो सकता है और बाद में राज्य असंगत होने पर बाद में ठीक से काम नहीं करेगा। ऐसी परिस्थितियों में abort() को प्राथमिकता दी जानी चाहिए।

+1

मुझे लगता है कि उदाहरण के लिए जब आईओडी असफलता के कारण अप्रत्यक्ष हो जाता है? आप इसे अपवाद के रूप में पकड़ते हैं लेकिन आप फ़ाइल ऑब्जेक्ट्स को नष्ट नहीं कर सकते हैं क्योंकि उनके विनाशकों को फ़ाइल को बंद करने की आवश्यकता होती है। विचार के लिए धन्यवाद। – doc

+2

@ डॉक: हाँ, लेकिन यह एक अपेक्षाकृत चरम उदाहरण है। एक और सी ++ उदाहरण: आप पहले से ही एक त्रुटि को संभालने में हैं और एक और त्रुटि होती है (त्रुटि प्रबंधन प्रक्रिया से संबंधित नहीं) और हैंडलिंग कोड पुन: प्रस्तुत किया जाता है। यह बहुत अच्छा नहीं है - त्रुटियां तेज़ी से होती हैं कि आप उन्हें संभाल सकते हैं। तो आप एक झंडा बनाए रखते हैं "मैं पहले से ही इस प्रकार की त्रुटि को संभालने में हूं"। कोड को फिर से घुमाने के बाद आप तौलिया में फेंक दें - तुरंत प्रोग्राम को समाप्त करने के लिए 'abort()' पर कॉल करें। – sharptooth

+1

यही कारण है कि आप विनाशकों से 'फेंक' नहीं देते हैं। यदि विनाशक को अपवाद के कारण अवांछित स्टैक के दौरान बुलाया जाता है, तो 'abort() 'कहा जाता है। –

19

उपयोग abort() अपने कार्यक्रम एक संभवतः भ्रष्ट राज्य में है और आप इसे बहुत खतरनाक आगे कुछ भी करने की कोशिश करने पर विचार करें। exit() किसी भी atexit फ़ंक्शंस का कारण बनता है, और स्थिर वस्तुओं के सी ++ विध्वंसकों को बुलाया जाएगा। आमतौर पर यह एक साफ निकास के लिए आप चाहते हैं, लेकिन यह विनाशकारी हो सकता है, उदाहरण के लिए, वे दूषित डेटा के साथ एक फ़ाइल को ओवरराइट करते हैं।

+3

+1: लेकिन आपके पास इसे करने के अन्य तरीके भी हैं। एटएक्सिट के रूप में पंजीकृत फ़ंक्शन को कॉल करने के लिए आप बाहर निकलने के बजाय _exit() भी कर सकते हैं, या तत्काल बाहर निकलने के लिए स्वयं को सिगकिल भी भेज सकते हैं। – kriss

+0

@ क्रिस: 'abort()' ऐसा करने का मानक तरीका है, और आसान है। आप एक गैर-मानक विधि क्यों चुनेंगे? – MSalters

+0

@ क्रिस: '_exit()' मानक सी या सी ++ नहीं है, और 'सिगैबर्ट' के अलावा सिग्नल बढ़ाने से निरस्त करना एक अजीब बात है। –

1

बीच में बंद करें preffered है जब आवेदन और अपवाद को संभालने में सक्षम परिदृश्य क्या करना है समझने में सक्षम नहीं doesnot। बाहर निकलें() मतलब आवेदन सभी कार्य को पूरा ढंग से पूरा करना होगा। अगर अपवाद होता है और एप्लिकेशन इसे संभालने में सक्षम होता है तो बाहर निकलें() कॉल होता है।

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

  • कोई संबंधित समस्या नहीं^_^