सी और सी ++ में, क्या बीच का अंतर है exit()
और abort()
? मैं एक त्रुटि (अपवाद नहीं) के बाद अपने कार्यक्रम को समाप्त करने की कोशिश कर रहा हूं।
सी और सी ++ में, क्या बीच का अंतर है exit()
और abort()
? मैं एक त्रुटि (अपवाद नहीं) के बाद अपने कार्यक्रम को समाप्त करने की कोशिश कर रहा हूं।
जवाबों:
abort()
बिना कॉल किए हुए फंक्शंस के लिए अपने प्रोग्राम से बाहर निकलता है atexit()
, और पहली बार ऑब्जेक्ट्स डिस्ट्रक्टर्स को कॉल किए बिना। exit()
अपने कार्यक्रम से बाहर निकलने से पहले दोनों करता है। हालांकि यह स्वचालित वस्तुओं के लिए विनाशकारी नहीं कहता है। इसलिए
A a;
void test() {
static A b;
A c;
exit(0);
}
विनाश करेगा a
और b
ठीक से, लेकिन के विनाशकों को नहीं बुलाएगा c
। abort()
न तो वस्तुओं को नष्ट करने वालों को नहीं बुलाएगा। जैसा कि यह दुर्भाग्यपूर्ण है, सी ++ मानक एक वैकल्पिक तंत्र का वर्णन करता है जो ठीक से समाप्ति सुनिश्चित करता है:
स्वचालित भंडारण अवधि वाली वस्तुएं एक कार्यक्रम में नष्ट हो जाती हैं, जिनके कार्य
main()
में कोई स्वचालित वस्तु नहीं होती है और कॉल को निष्पादित करती हैexit()
।main()
एक अपवाद को फेंककर नियंत्रण को सीधे ऐसे स्थानांतरित किया जा सकता है जो अंदर पकड़ा गया होmain()
।
struct exit_exception {
int c;
exit_exception(int c):c(c) { }
};
int main() {
try {
// put all code in here
} catch(exit_exception& e) {
exit(e.c);
}
}
कॉल exit()
करने के throw exit_exception(exit_code);
बजाय उस कोड को व्यवस्थित करें ।
abort एक 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
जब प्रोग्राम कॉल होता है तो निम्न चीजें होती हैं exit
():
atexit
कार्य निष्पादित किए जाते हैंtmpfile
इनके द्वारा बनाई गई फाइलें हटा दी जाती हैंabort
() फ़ंक्शन भेजता है SIGABRT
यह पकड़ा नहीं है, तो कार्यक्रम कोई गारंटी नहीं कि खुले धाराओं प्लावित / बंद हो जाती हैं या के माध्यम से बनाया अस्थायी फ़ाइलों को उस के साथ समाप्त होता है, वर्तमान प्रक्रिया के लिए संकेत tmpfile
निकाल दिए जाते हैं, atexit
पंजीकृत कार्यों कहा जाता है नहीं कर रहे हैं, और एक गैर मेजबान के लिए शून्य निकास स्थिति वापस आ गई है।
बाहर निकलने से () मैनुअल पेज:
निकास () फ़ंक्शन सामान्य प्रक्रिया समाप्ति का कारण बनता है और स्थिति और 0377 का मान माता-पिता को वापस कर दिया जाता है।
गर्भपात () मैनुअल पेज से:
गर्भपात () पहले SIGABRT सिग्नल को अनब्लॉक करता है, और फिर कॉलिंग प्रक्रिया के लिए उस सिग्नल को उठाता है। यह प्रक्रिया की असामान्य समाप्ति के परिणामस्वरूप होता है जब तक कि SIGABRT सिग्नल पकड़ा नहीं जाता है और सिग्नल हैंडलर वापस नहीं आता है।
abort
SIGABRT
संकेत भेजता है । abort
कॉलर को वापस नहीं करता है। SIGABRT
सिग्नल के लिए डिफ़ॉल्ट हैंडलर एप्लिकेशन को बंद कर देता है। stdio
फ़ाइल धाराओं को फ़्लश किया जाता है, फिर बंद कर दिया जाता है। C ++ वर्ग के उदाहरणों के लिए विनाशकारी नहीं हैं, हालांकि (इस पर निश्चित नहीं हैं - शायद परिणाम अपरिभाषित हैं)।
exit
अपने स्वयं के कॉलबैक हैं, जिनके साथ सेट किया गया है atexit
। यदि कॉलबैक निर्दिष्ट किए जाते हैं (या केवल एक), तो उन्हें अपने पंजीकरण क्रम के क्रम में (स्टैक की तरह) कहा जाता है, फिर प्रोग्राम बाहर निकलता है। साथ abort
, exit
कॉल करने वाले के पास वापस नहीं जाता है। stdio
फ़ाइल धाराओं को फ़्लश किया जाता है, फिर बंद कर दिया जाता है। इसके अलावा, C ++ वर्ग के उदाहरणों के लिए विध्वंसक कहा जाता है।