2008-08-14 18 views
17

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

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

और

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

तथ्य on_exit द्वारा इस्तेमाल किया समारोह से बाहर निकलें स्थिति हो जाता है कि अन्य की तुलना में के बीच कोई अंतर है?

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

संपादित करें: कई उत्तरों ने on_exit के खिलाफ चेतावनी दी क्योंकि यह गैर-मानक है। यदि मैं एक ऐसा ऐप विकसित कर रहा हूं जो आंतरिक कॉर्पोरेट उपयोग के लिए है और विशिष्ट कॉन्फ़िगरेशन पर चलाने की गारंटी है, तो क्या मुझे इसके बारे में चिंता करनी चाहिए?

उत्तर

14

this link के अनुसार मुझे लगता है कि ऐसा लगता है कि कुछ मतभेद हैं। on_exit आप एक तर्क यह है कि on_exit समारोह जब यह कहा जाता है ... जो आप जब यह बाहर निकलने के लिए समय आ गया है पर कुछ सफाई काम करने के लिए कुछ संकेत दिए गए सेट करने देते हो सकता है करने के लिए पारित हो जाता है में पारित होगा।

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

17

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

Kernel.org पर उपलब्ध नहीं है - on_exit():

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

0

@Nathan

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

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

1

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

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

3

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