सबसे पहले, कार्यक्रम निकास का कोई भी रूप स्वचालित रूप से ढेर वस्तुओं के लिए विनाशकों को कॉल नहीं करेगा (आईएसओ/आईईसी 14882: 1998 (ई) 12.4.10 में निहित)।
exit()
कॉलिंग स्वचालित अवधि वाले ऑब्जेक्ट्स के लिए विनाशकों को कॉल नहीं करेगा, क्योंकि यह उनके संलग्न स्कोप (3.6.1.4) के माध्यम से वापस नहीं आती है। हालांकि, स्थैतिक वस्तुओं के लिए विनाशक को निर्माण के विपरीत क्रम (18.3.8) में बुलाया जाएगा।
कॉलिंग abort()
किसी भी प्रकार के ऑब्जेक्ट के लिए किसी भी विनाशक को कॉल नहीं करता है, और न ही यह atexit()
पंजीकृत फ़ंक्शन (18.3.3) पर कॉल करता है। मेरे पास सी ++ मानक प्रतिलिपि है जो थोड़ा सा दिनांकित है और _exit
या _Exit
का उल्लेख नहीं करता है, लेकिन मुझे लगता है कि, यदि मौजूद है, तो उन्हें वही व्यवहार करना चाहिए - यानी, किसी भी विनाशक को फोन नहीं करना चाहिए। विशेष रूप से, सी 99 मानक में, _Exit()
स्किप atexit
हैंडलर (यह कार्यान्वयन परिभाषित किया गया है कि स्ट्रीम बफर फ़्लश किए गए हैं, खुली धाराएं बंद हैं, या अस्थायी फ़ाइलें हटा दी गई हैं)।
इसके अलावा ध्यान दें कि abort()
संकेत SIGABRT
(फँसाने द्वारा रद्द किया जा सकता आईएसओ/आईईसी 9899: 1999 (ई) 7.20.4.1.2 - मैं केवल C99 यहाँ है, लेकिन मैं उम्मीद यह संस्करण सी द्वारा संदर्भित में ही होगा ++)। _Exit()
नहीं कर सकता।
एक और अधिक व्यावहारिक टिप्पणी पर, abort()
और _exit()
के सबसे यूनिक्स कार्यान्वयन पर, abort()
एक SIGABRT
जबकि _exit()
बस एक ऑपरेटिंग सिस्टम प्रक्रिया तुरंत समाप्त करने के लिए कॉल कॉल को जन्म देती है। इसका मतलब है कि मुख्य अंतर हैं:
- आप एक निकास कोड निर्दिष्ट कर सकते हैं
_exit()
abort()
के लिए एक संकेत हैंडलर
- पर सिस्टम विन्यास, ओएस, और ulimits निर्भर करता है में फंस जा सकता है,
abort()
में हो सकता है एक कोर डंप या इसी तरह
एक fork()/exec()
पैटर्न में, _exit()
शायद बेहतर होगा, कोर डंप करने की संभावना से बचने के लिए।
मुझे नहीं लगता कि आपका "कांटा? Exec: _exit" सटीक रूप से कैप्चर करता है कि आमतौर पर इसका उपयोग कैसे किया जाता है। यह और अधिक होगा: "(कांटा == 0)?/* बच्चा */(exec, _exit):/* पैरेंट */(जारी रखें, प्रतीक्षा करें)" – nobar
@ नोबार: मैंने मुहावरे को संक्षिप्त नाम देने की कोशिश की यथासंभव। मुझे डर लगता है कि यह वास्तविक कोड की तरह दिखने से लोगों को टिप्पणी शुरू करने में उत्तेजित करेगा (जैसे "आप त्रुटियों की जांच करना भूल गए हैं")। –
हाँ, मैं उन टिप्पणियों को बना देता। बस मजाक कर रहा है :) वास्तव में, इसके साथ मेरी समस्या यह है कि यह वास्तविक कोड की तरह दिखता है ("?:" ऑपरेटर का उपयोग करके), और चूंकि यह गलत है क्योंकि इससे मुझे कुछ भ्रम पैदा हुआ। – nobar