2015-11-12 5 views
5

मैंने देखा है कि /bin और /usr/bin में FreeBSD कोड return के बजाय exit उपयोग करने के लिए कुछ ठीक है, कि क्या मतलब है?वापसी FreeBSD/bin/और/usr/bin में बाहर निकलने बनाम

मेरे पास मेरे विचार में यह है कि return कथन vfork(2) को स्टैक फ्रेम को दूषित करने का कारण बन सकता है, क्या इसका एकमात्र कारण है? यदि यह सत्य था, तो /bin और /usr/bin में आदेशों का केवल एक हिस्सा क्यों नहीं मिला, उन सभी को नहीं?

+3

क्या आप कुछ और ठोस बना सकते हैं? एक प्रतिबद्धता की तरह, स्रोत फ़ाइलों की एक सूची, या कुछ? इस सवाल को और अधिक संदर्भ के बिना समझना बहुत मुश्किल है। – unwind

+1

फ्रीबीएसडी '/ बिन/डीएफ' में 'मुख्य()' में हाल ही में वापसी के बजाय निकास() का उपयोग करें, लेकिन/bin/cat अभी भी' मुख्य() 'में 'वापसी' का उपयोग करें। – oxnz

+2

@oxnz: शायद ऐसा कुछ हो सकता है? http://stackoverflow.com/a/5856935/214671 –

उत्तर

1

5.1.2.2.3p1

तो मुख्य कार्य की वापसी प्रकार int के साथ एक प्रकार संगत है के अनुसार, मुख्य कार्य करने के लिए प्रारंभिक कॉल से एक वापसी से दिए गए मान के साथ बाहर निकलने के कार्यप्रणाली को कॉल के बराबर है अपने तर्क के रूप में मुख्य कार्य

यह आपके भ्रष्ट स्टैक फ्रेम सिद्धांत बाहर नियम; return 0; सी कार्यान्वयन के अनुरूप exit(0); के लिए कार्यात्मक रूप से समान है (कम से कम गैर-पुनरावर्ती main प्रवेश बिंदुओं के लिए)।

मैं सुझाव दूंगा कि यह परिवर्तन केवल स्टाइलिस्ट था, या शायद अज्ञानता द्वारा निर्देशित किया गया था। एक अन्य संभावना यह है कि लेखक को main को एक पुनरावर्ती फ़ंक्शन में बदलने की इच्छा है (या main पहले से ही एक पुनरावर्ती फ़ंक्शन में बदल दिया गया है; idk, मैंने अभी एक त्वरित grep किया है और यह तुरंत रिकर्सिव नहीं लगता है)। अंत में, पिछले गंभीर विकल्प के रूप में, शायद सी कार्यान्वयन कि FreeBSD का उपयोग करता है गैर-अनुरूप (मुझे यकीन है कि नहीं आशा है कि!) ...

संपादित: यह सिर्फ this answer के माध्यम से पढ़ने के लिए इस हो सकता है द्वारा घटित हुआ एक कंपाइलर बग के लिए एक कार्य-आसपास रहा है, लेकिन मैंने atexit के उपयोग के लिए स्रोत कोड की जांच की है और किसी भी आगे तर्क की इस पंक्ति को आगे बढ़ाने का कोई कारण नहीं मिला।

0

मेरी राय में ऐसा करने के लिए वास्तव में बहुत अच्छा कारण नहीं है।

यह विशेष परिवर्तन this post में फ्रीब्स मेलिंग सूची पर चर्चा की गई है।

लघु कहानी है कि प्रतिबद्ध लॉग

तो यह स्थिर विश्लेषक मदद करने के लिए "एक टूट स्थिर विश्लेषक के आसपास काम करने के लिए उपयोग किया गया निकास() के बजाय मुख्य में वापसी()" होना चाहिए

, और है मेमोरी विश्लेषकों जो अन्यथा मुख्य() में मेमोरी रिसाव के रूप में आवंटित सामान की रिपोर्ट करेंगे - जो कि सबसे सरल उपयोगिताएं आवंटित करने के लिए परेशान नहीं होती हैं क्योंकि प्रक्रिया बाहर निकलने जा रही है।

1

चलो देखते हैं कि मैं दूसरों द्वारा प्रदान किए गए विभिन्न लिंक को उचित उत्तर में जोड़ सकता हूं या नहीं।


As far as the C language is concerned, there is no difference.

exit() को एक कॉल करता है

  1. कॉल atexit() के साथ पंजीकृत कार्यों;
  2. फ्लश और आउटपुट स्ट्रीम को बंद करता है;
  3. tmpfile() के साथ खोले गए फ़ाइलों को हटा देता है;
  4. पर्यावरण पर नियंत्रण देता है।

return <n> मुख्य से exit(<n>) के बराबर है।


Some flawed static code analyzers think different.

जहां तक ​​सी भाषा का संबंध है, स्मृति main() द्वारा आवंटित और नहीं free()है लीक। यूनिक्स प्रक्रिया समाप्ति पर साफ हो जाता है, लेकिन सभी ऑपरेटिंग सिस्टम (!) नहीं करते हैं।

जाहिर है, कुछ स्थिर कोड विश्लेषक स्मृति अभी भी exit() के बिंदु पर आवंटित करने पर विचार लीक नहीं, यही वजह है कि है कि प्रतिबद्ध बनाया गया था (जबकि वे main() से return के लिए करते हैं) (से छुटकारा पाने के होने के लिए चेतावनी)।

यह कोड विश्लेषक में बग के लिए एक कामकाज है।


As far as the C++ language is concerned, there is a lot of difference.

जब आप returnmain() से, आप समारोह है, जो स्थानीय वस्तुओं नष्ट हो का मतलब है की गुंजाइश छोड़ रहे हैं।

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

जब आप main() से std::exit() कहते हैं, कि समारोह सीधे क्रम को नियंत्रण अपने हाथ में बदल जाता है। main() फ़ंक्शन कभी वापस नहीं लौटाता है, बिनाmain() -लोकल ऑब्जेक्ट्स के विनाशकों को बुलाते हुए प्रक्रिया समाप्त हो जाती है।

इसके अलावा, जबकि std::exit() फ्लश और सी आउटपुट स्ट्रीम बंद करने के लिए परिभाषित किया गया है, वहाँ सी ++ उत्पादन के लिए इस तरह के कोई प्रावधान नहीं स्ट्रीम है।

+0

आप बहुत ज्यादा सोच रहे हैं और अनुमान लगा रहे हैं। (1) 'मुख्य()' से 'वापसी 'और' निकास() 'के बीच एक अंतर है, और यह' मुख्य() 'में परिभाषित वस्तुओं के जीवनकाल के साथ करना है जिसमें स्वचालित-भंडारण अवधि है (और दुर्लभ संभावना उन्हें 'atexit() 'के साथ पंजीकृत कॉलबैक द्वारा संदर्भित किया जा सकता है)। (2) किसी भी स्मृति को कहीं भी आवंटित किया गया है और 'निकास() 'से पहले मुक्त नहीं किया गया है। 'मुख्य()' के बारे में कुछ खास नहीं है। कोई वास्तविक स्थिर विश्लेषक नहीं है जो भ्रमित हो जाएगा (लेखक भी धारणाएं बना रहा था और उलझन में था)। (3) सी ++ यहां अप्रासंगिक है। –

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