c++ - निकास() और abort() के बीच क्या अंतर है?




error-handling exit (4)

निम्न चीज़ें तब होती हैं जब कोई प्रोग्राम exit ():

  • atexit फ़ंक्शन द्वारा पंजीकृत फ़ंक्शंस निष्पादित किए जाते हैं
  • सभी खुली धाराओं को फ्लश और बंद कर दिया जाता है, tmpfile द्वारा बनाई गई फ़ाइलें हटा दी tmpfile हैं
  • कार्यक्रम मेजबान को निर्दिष्ट निकास कोड के साथ समाप्त होता है

abort () फ़ंक्शन वर्तमान प्रक्रिया में SIGABRT सिग्नल भेजता है, अगर इसे पकड़ा नहीं जाता है तो प्रोग्राम को कोई गारंटी नहीं दी जाती है कि खुली धाराएं फ़्लश / बंद हो जाती हैं या tmpfile के माध्यम से बनाई गई अस्थायी फ़ाइलें हटा दी tmpfile हैं, tmpfile पंजीकृत फ़ंक्शंस को नहीं कहा जाता है, और मेजबान में एक गैर-शून्य निकास स्थिति लौटा दी जाती है।

सी और सी ++ में, exit() और abort() बीच क्या अंतर है? मैं एक त्रुटि के बाद अपने कार्यक्रम को समाप्त करने की कोशिश कर रहा हूं (अपवाद नहीं)।


बाहर निकलें () मैनुअल पेज से:

निकास () फ़ंक्शन सामान्य प्रक्रिया समाप्ति का कारण बनता है और स्थिति का मान और 0377 माता-पिता को वापस कर दिया जाता है।

Abort () मैनुअल पेज से:

Abort () पहले SIGABRT सिग्नल को अनब्लॉक करता है, और उसके बाद कॉलिंग प्रक्रिया के लिए उस सिग्नल को बढ़ाता है। इसका परिणाम प्रक्रिया की असामान्य समाप्ति में होता है जब तक कि SIGABRT सिग्नल पकड़ा नहीं जाता है और सिग्नल हैंडलर वापस नहीं आता है।


abort SIGABRT संकेत भेजता है। abort कॉलर पर वापस नहीं आता है। SIGABRT सिग्नल के लिए डिफ़ॉल्ट हैंडलर एप्लिकेशन को बंद कर देता है। stdio फ़ाइल धाराओं flushed हैं, तो बंद कर दिया। सी ++ वर्ग के उदाहरणों के लिए विनाशक नहीं हैं, हालांकि (इस पर निश्चित नहीं है - शायद परिणाम अपरिभाषित हैं?)।

exit साथ सेट, exit अपने स्वयं के कॉलबैक है। यदि कॉलबैक निर्दिष्ट हैं (या केवल एक), तो उन्हें अपने पंजीकरण आदेश (जैसे ढेर की तरह) के क्रम में कहा जाता है, तो कार्यक्रम निकलता है। abort साथ, exit वाला कॉलर पर वापस नहीं आता है। stdio फ़ाइल धाराओं flushed हैं, तो बंद कर दिया। इसके अलावा, सी ++ वर्ग के उदाहरणों के लिए विनाशक कहा जाता है।


निरस्त एक SIGABRT सिग्नल भेजता है, बाहर निकलें सामान्य सफाई करने वाले एप्लिकेशन को बंद कर देता है।

हालांकि आप एक निरस्त सिग्नल को संभाल सकते हैं, लेकिन डिफ़ॉल्ट व्यवहार एप्लिकेशन को बंद करने के साथ-साथ त्रुटि कोड भी है।

निरस्त आपके स्थिर और वैश्विक सदस्यों के ऑब्जेक्ट विनाश को निष्पादित नहीं करेगा, लेकिन बाहर निकलेंगे

बेशक जब आवेदन पूरी तरह बंद हो जाता है तो ऑपरेटिंग सिस्टम किसी भी मुक्त स्मृति और अन्य संसाधनों को मुक्त कर देगा।

दोनों निरस्त और निकास कार्यक्रम समाप्ति में (माना जाता है कि आपने डिफ़ॉल्ट व्यवहार को ओवरराइड नहीं किया है), रिटर्न कोड आपके आवेदन को शुरू करने वाली मूल प्रक्रिया में वापस कर दिया जाएगा।

निम्नलिखित उदाहरण देखें:

SomeClassType someobject;

void myProgramIsTerminating1(void)
{
  cout<<"exit function 1"<<endl;
}

void myProgramIsTerminating2(void)
{
  cout<<"exit function 2"<<endl;
}

int main(int argc, char**argv)
{
  atexit (myProgramIsTerminating1);
  atexit (myProgramIsTerminating2);
  //abort();
  return 0;
}

टिप्पणियाँ:

  • अगर गर्भपात अव्यवस्थित है: कुछ भी मुद्रित नहीं होता है और कुछ तत्व के विनाशक को नहीं बुलाया जाएगा।

  • यदि निरस्त की तरह टिप्पणी की गई है: कुछ प्रोजेक्ट विनाशक कहा जाएगा आपको निम्न आउटपुट प्राप्त होगा:

निकास समारोह 2
निकास समारोह 1





abort