सी लाइब्रेरी 1errno
ऐतिहासिक कारणों से 0 पर सेट नहीं होती है । POSIX अब यह दावा नहीं करता है कि इसकी लाइब्रेरी सफलता के मामले में मूल्य में बदलाव नहीं करेगी, और इसके लिए नया लिनक्स मैन पेज :errno.h
<errno.h>
हेडर फाइल पूर्णांक चर को परिभाषित करता है errno
, जो सिस्टम कॉल और एक त्रुटि की स्थिति में कुछ पुस्तकालय कार्यों से संकेत मिलता है क्या गलत हुआ द्वारा निर्धारित है। इसका मूल्य तभी महत्वपूर्ण है जब कॉल के रिटर्न मूल्य में त्रुटि (यानी, -1
अधिकांश सिस्टम कॉल से; -1
या NULL
अधिकांश पुस्तकालय कार्यों से) संकेत दिया गया हो ; एक फ़ंक्शन जो सफल होता है उसे बदलने की अनुमति है errno
।
एएनएसआई सी दलील कहा गया है कि समिति ने महसूस किया इसे अपनाने और उपयोग करने का मौजूदा प्रथा को मानकीकृत करने के लिए और अधिक व्यावहारिक था errno
।
सेटिंग के बारे में केंद्रित त्रुटि रिपोर्टिंग मशीनरी errno
को आमतौर पर सहिष्णुता के साथ सबसे अच्छा माना जाता है। इसमें लाइब्रेरी के कार्यों के बीच एक `` पैथोलॉजिकल युग्मन '' की आवश्यकता होती है और यह एक स्थिर लिखने योग्य मेमोरी सेल का उपयोग करता है, जो कि साझा करने योग्य पुस्तकालयों के निर्माण में हस्तक्षेप करता है। फिर भी, समिति ने इस मौजूदा, हालांकि कमी, मशीनरी का मानकीकरण करना पसंद किया, बजाय इसके कि कुछ और महत्वाकांक्षी का आविष्कार किया जाए।
यदि errno
सेट किया गया है तो जाँच के बाहर त्रुटि की जाँच करने का लगभग हमेशा एक तरीका है । यदि errno
सेट किया गया है तो हमेशा चेक करना विश्वसनीय नहीं होता है, क्योंकि कुछ कॉल में त्रुटि का कारण जानने के लिए अलग एपीआई की आवश्यकता होती है। उदाहरण के लिए, ferror()
किसी त्रुटि के लिए जाँच करने के लिए उपयोग किया जाता है यदि आपको इससे कोई छोटा परिणाम मिलता है fread()
या fwrite()
।
दिलचस्प रूप से पर्याप्त है, उपयोग करने strtod()
का आपका उदाहरण उन मामलों में से एक है जहां errno
कॉल करने से पहले 0 पर सेट करना आवश्यक है, अगर त्रुटि हुई है तो सही ढंग से पता लगाने के लिए। सभी strto*()
स्ट्रिंग टू नंबर फ़ंक्शंस की यह आवश्यकता होती है, क्योंकि एक त्रुटि के कारण भी एक वैध रिटर्न वैल्यू वापस आ जाती है।
errno = 0;
char *endptr;
double x = strtod(str1, &endptr);
if (endptr == str1) {
/*...parse error */
} else if (errno == ERANGE) {
if (x == 0) {
/*...underflow */
} else if (x == HUGE_VAL) {
/*...positive overflow */
} else if (x == -HUGE_VAL) {
/*...negative overflow */
} else {
/*...unknown range error? */
}
}
उपरोक्त कोड strtod()
लिनक्स पर प्रलेखित व्यवहार के आधार पर है । सी मानक केवल उल्लेख है कि अधःप्रवाह एक मूल्य के अधिक से अधिक वापस नहीं लौट सकते छोटी से छोटी सकारात्मक की तुलना में double
, और चाहे या नहीं errno
पर सेट है ERANGE
है कार्यान्वयन परिभाषित 2 ।
वास्तव में एक व्यापक सर्टिफिकेट एडवाइजरी राइट-अप है जो errno
लाइब्रेरी कॉल से पहले हमेशा 0 पर सेट करने की सलाह देता है और कॉल फेल होने के बाद इसकी वैल्यू चेक करता है । ऐसा इसलिए है क्योंकि कुछ लाइब्रेरी कॉल सेट हो जाएंगी errno
भले ही कॉल 3 सफल हो ।
errno
प्रोग्राम स्टार्टअप पर 0 का मान है, लेकिन किसी भी लाइब्रेरी फ़ंक्शन द्वारा इसे कभी भी 0 पर सेट नहीं किया जाता है। errno
एक लाइब्रेरी फ़ंक्शन कॉल द्वारा मान को गैर-जासूसी के लिए सेट किया जा सकता है कि क्या कोई त्रुटि है या नहीं, बशर्ते errno
कि सी मानक में फ़ंक्शन के विवरण में उपयोग नहीं किया गया है। errno
किसी त्रुटि की सूचना के बाद ही किसी कार्यक्रम की सामग्री का निरीक्षण करना सार्थक है । अधिक सटीक रूप से, errno
लाइब्रेरी फ़ंक्शन के बाद ही सार्थक होता है जो errno
त्रुटि पर सेट होता है, एक त्रुटि कोड वापस आ गया है।
1. पहले मैंने दावा किया था कि यह एक पुराने कॉल से त्रुटि को रोकने के लिए था। मुझे इस दावे का समर्थन करने के लिए कोई सबूत नहीं मिला। मेरे पास एक फर्जी printf()
उदाहरण भी था ।
2. इसे इंगित करने के लिए @chux को धन्यवाद। संदर्भ C.11 is7.22.1.3 §10 है।
3. एक टिप्पणी में @KeithThompson द्वारा इंगित किया गया।
errno
, तो आप इसे हमेशा खुद को शून्य करने के लिए सेट कर सकते हैं।