मैन पेजों को पढ़ना और कुछ कोड वास्तव में में मुझे मदद नहीं करते थे - या बेहतर, जब मुझे उपयोग करना चाहिए - perror("...")
या fprintf(stderr, "...")
।मुझे पेरर ("...") और fprintf (stderr, "...") का उपयोग कब करना चाहिए?
उत्तर
कॉलिंग perror
आप errno
की व्याख्या मूल्य है, जो एक धागे की स्थानीय त्रुटि POSIX syscalls (यह errno
के लिए स्वयं का मान है, यानी, हर धागा है) द्वारा लिए लिखा मूल्य है दे देंगे। उदाहरण के लिए, यदि आपने open()
पर कॉल किया है, और वहां एक त्रुटि उत्पन्न हुई थी (यानी, यह -1
लौटा), तो आप तुरंत बाद में perror
पर कॉल कर सकते थे ताकि वास्तविक त्रुटि क्या हो। ध्यान रखें कि यदि आप इस दौरान अन्य सिस्को कॉल करते हैं, तो errno
में मान लिखा जाएगा, और perror
पर कॉल करने से पहले आपके सिसिल द्वारा त्रुटि उत्पन्न होने पर आपकी समस्या का निदान करने में कोई भी उपयोग नहीं किया जाएगा।
fprintf(stderr, ...)
दूसरी तरफ अपने स्वयं के कस्टम त्रुटि संदेशों को मुद्रित करने के लिए उपयोग किया जा सकता है। stderr
पर प्रिंट करके, आप अपने त्रुटि रिपोर्टिंग आउटपुट से "सामान्य" आउटपुट के साथ मिश्रित होने से बचें जो stdout
पर जा रहा है।
ध्यान रखें कि fprintf(stderr, "%s\n", strerror(errno))
perror(NULL)
के समान है के बाद से strerror(errno)
के लिए एक कॉल errno
के लिए मुद्रित स्ट्रिंग मान उत्पन्न होगा, और आप तो संयुक्त कर सकते हैं कि fprintf
के माध्यम से किसी भी अन्य कस्टम त्रुटि संदेश के साथ।
perror(const char *s)
: उस स्ट्रिंग को प्रिंट करता है जो आप इसे देते हैं उसके बाद errno
के वर्तमान मान का वर्णन करता है।
stderr
: यह एक आउटपुट स्ट्रीम है जो आपके स्वयं के त्रुटि संदेशों को पाइप करने के लिए उपयोग की जाती है (टर्मिनल पर डिफ़ॉल्ट)।
प्रासंगिक:
char *strerror(int errnum)
: यह एक त्रुटि नंबर देते हैं, और यह जुड़े त्रुटि स्ट्रिंग लौट जाएँगे।
वे अलग-अलग चीजें करते हैं।
का उपयोग stderr
पर एक संदेश मुद्रित करने के लिए errno
से संबंधित है। कुछ से stderr
, या किसी अन्य स्ट्रीम को मुद्रित करने के लिए आप fprintf()
का उपयोग करते हैं। perror()
एक बहुत ही विशेष मुद्रण कार्य है:
perror(str);
के बराबर है
if (str)
fprintf(stderr, "%s: %s\n", str, strerror(errno));
else
fprintf(stderr, "%s\n", strerror(errno));
Perror समारोह और समय लगेगा निष्पादन कॉल kernal अंतरिक्ष wheras fprintf कॉल
KERNAL करने के लिए एपीआई के लिए जाते समय के लिए उपयोगकर्ता अंतरिक्ष से चला जाता है प्रदर्शन करने के लिएperror() हमेशा stderr लिखता है; strerr(), fprintf() के साथ एक साथ उपयोग किया जाता है, किसी भी आउटपुट को लिख सकता है - जिसमें stderr शामिल है लेकिन विशेष रूप से नहीं।
fprintf(stdout, "Error: %s", strerror(errno));
fprintf(stderr, "Error: %s", strerror(errno)); // which is equivalent to perror("Error")
इसके अलावा, perror लगाता है उसका स्वयं का पाठ formating "पाठ: त्रुटि विवरण"
ओह, मिल गया it.The perror समारोह अलग ढंग से errno के मूल्य के आधार काम करता है।'यदि आप किसी फ़ंक्शन का उपयोग करते हैं जो त्रुटि को प्रभावित करता है तो यह पर्लर का उपयोग करने के लिए समझ में आता है। अगर आप ऐसे फ़ंक्शन का उपयोग करते हैं जो त्रुटि को प्रभावित नहीं करता है और केवल एक त्रुटि कोड देता है तो आपको fprintf (stderr, fmt, ...) का उपयोग करना चाहिए। उदाहरण के लिए, यदि स्ट्रिंग रेंज से बाहर है और ERANGE को इरनो सेट करें तो स्ट्रॉटल LONG_MAX या LONG_MIN लौटाएगा। तो यदि सीमा से बाहर स्ट्रेटोल विफल रहता है, तो मैं पेरर का उपयोग करूंगा। – freeboy1015
एक विवरण, 'strerror' थ्रेड-सुरक्षित होने की आवश्यकता नहीं है। यह बेवकूफ है, लेकिन यह मानक है। POSIX 2008 सिस्टम पर ड्रॉप-इन प्रतिस्थापन के रूप में 'strerror_l' का उपयोग किया जा सकता है। 'strerror_r' पुरानी प्रणालियों पर भी उपलब्ध है लेकिन इसके कुछ गैर-अनुरूप संस्करण वाले सिस्टम के साथ वास्तव में ग़लत समस्याएं हैं। –
एक नाइटपिक के रूप में भी, मुझे लगता है कि 'perror' अंत में' '\ n'' जोड़ता है, इसलिए प्रारूप '% s \ n" ', नहीं होगा? –