क्या on_exit () और atexit () फ़ंक्शंस के बीच कोई अंतर है?

क्या इसमें कोई अंतर है

   int on_exit(void (*function)(int , void *), void *arg);

तथा

   int atexit(void (*function)(void));

इस तथ्य के अलावा कि on_exit द्वारा उपयोग किए गए फ़ंक्शन से बाहर निकलने की स्थिति मिलती है?

यही है, अगर मुझे बाहर निकलने की स्थिति की परवाह नहीं है, तो क्या एक या दूसरे का उपयोग करने का कोई कारण है?

Edit: Many of the answers warned against on_exit because it's non-stतथाard. If I'm developing an app that is for internal corporate use तथा guaranteed to run on specific configurations, should I worry about this?

0
ro fr bn

5 उत्तर

यह लिंक के अनुसार मैंने पाया, ऐसा लगता है कि कुछ अंतर हैं। on_exit आपको उस तर्क में गुजरने देगा जो on_exit फ़ंक्शन में भेजा जाता है जब इसे कॉल किया जाता है ... जो आपको कुछ क्लीनअप कार्य करने के लिए कुछ पॉइंटर्स सेट करने देता है जब बाहर निकलने का समय हो।

इसके अलावा, ऐसा प्रतीत होता है कि on_exit एक सनोस विशिष्ट फ़ंक्शन था जो सभी प्लेटफ़ॉर्म पर संगत नहीं हो सकता है ... इसलिए आप अधिक प्रतिबंधित होने के बावजूद अतुलनीय रहना चाहेंगे।

0
जोड़ा

@Nathan

सबसे पहले, देखें कि बाहर निकलने की स्थिति निर्धारित करने के लिए कोई और एपीआई कॉल है ... एक त्वरित नज़र और मुझे एक नहीं दिखाई देता है, लेकिन मैं मानक सी एपीआई में अच्छी तरह से नहीं जानता हूं।

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

0
जोड़ा

यदि संभव हो तो आपको atexit() का उपयोग करना चाहिए। on_exit() गैर मानक और कम आम है। उदाहरण के लिए, यह ओएस एक्स पर उपलब्ध नहीं है।

Kernel.org - on_exit() :

यह फ़ंक्शन SunOS 4 से आता है, लेकिन libc4, libc5 और में भी मौजूद है   glibc। यह अब सोलारिस (सनोस 5) में नहीं होता है। इस समारोह से बचें, और   इसके बजाय मानक atexit (3) का उपयोग करें।

0
जोड़ा

@ नाथन, मुझे कोई भी फ़ंक्शन नहीं मिल रहा है जो वर्तमान चल रही प्रक्रिया के लिए निकास कोड लौटाएगा। मुझे उम्मीद है कि यह अभी तक उस बिंदु पर सेट नहीं है जब atexit() को वैसे भी कहा जाता है। इसका मतलब है कि रनटाइम जानता है कि यह क्या है, लेकिन शायद इसे ओएस को रिपोर्ट नहीं किया गया है। यद्यपि यह बहुत अधिक अनुमान है।

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

0
जोड़ा

अंतर यह है कि atexit सी है और on_exit कुछ अजीब एक्सटेंशन जीएनयू पर उपलब्ध है और कौन जानता है- अन्य यूनिक्स सिस्टम (लेकिन नहीं POSIX का हिस्सा)।

0
जोड़ा