2012-11-23 14 views
5

सी फ़ंक्शन strerror विस्तृत त्रुटि स्ट्रिंग देता है, विस्तृत here के रूप में। उदाहरण स्ट्रिंगस्ट्रेरर विवरण तार

 
No such file or directory 

प्रश्न यह है कि इन तारों को परिभाषित किया गया है? मैंने अपनी हेडर फाइलों को देखा और कुछ भी नहीं देखा।

उत्तर

5

वे सी पुस्तकालय में कहीं परिभाषित कर रहे हैं, पारंपरिक रूप से लंबाई sys_nerr की sys_errlist कहा जाता है, कम से कम यूनिक्स सिस्टम पर char* के एक वैश्विक सरणी में।

क्योंकि लीगेसी प्रोग्राम, strerror से पहले लिखा मानकीकरण किया गया था, इस सरणी सीधे पहुंच सकते हैं, यह अभी भी भी पिछली संगतता के लिए आधुनिक जीएनयू/लिनक्स और मैक ओएस एक्स पर उपलब्ध है (हालांकि तुम सच में perror या strerror के माध्यम से छोड़कर इसे उपयोग नहीं करना चाहिए)।

E.g, यहां Mac OS X 10.8.2 definition of sys_errlist है।

2

वे आमतौर पर आपके सी रनटाइम लाइब्रेरी में परिभाषित और एम्बेडेड होते हैं, उदा। सिस्टम की तरह अधिकांश यूनिक्स पर libc। आम तौर पर strerror.o (या .obj, आदि) -

2

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

4

कि त्रुटि संदेश शामिल हेडर फाइल errmsg.h

00012 const char *const sys_errlist[] = { 
00013   "Operation succeeded",  /* 0 */ 
00014   "Invalid argument",   /* EINVAL */ 
00015   "Bad memory address",   /* EFAULT */ 
00016   "String too long",   /* ENAMETOOLONG */ 
00017   "Out of memory",    /* ENOMEM */ 
00018   "Input/output error",   /* EIO */ 
00019   "No such file or directory", /* ENOENT */ 
00020   "Not a directory",   /* ENOTDIR */ 
00021   "Is a directory",    /* EISDIR */ 
00022   "File or object exists",  /* EEXIST */ 
00023   "Cross-device link",   /* EXDEV */ 
00024   "Try again later",   /* EAGAIN */ 
00025   "Illegal seek",    /* ESPIPE */ 
00026   "Unimplemented feature",  /* EUNIMP */ 
00027   "Device not available",  /* ENXIO */ 
00028   "No such device",    /* ENODEV */ 
00029   "Device or resource busy", /* EBUSY */ 
00030   "Invalid/inappropriate ioctl",/* EIOCTL (ENOTTY in Unix) */ 
00031   "Directory not empty",  /* ENOTEMPTY */ 
00032   "Result too large",   /* ERANGE */ 
00033   "No space left on device", /* ENOSPC */ 
00034   "Too many open files",  /* EMFILE */ 
00035   "Too many open files in system",/* ENFILE */ 
00036   "No such system call",  /* ENOSYS */ 
00037   "File is not executable",  /* ENOEXEC */ 
00038   "Argument list too long",  /* E2BIG */ 
00039   "Bad file number",   /* EBADF */ 
00040 }; 

नाम पर है आप देख सकते हैं यह libc कार्यान्वयन पर निर्भर करता है। लेकिन सामान्य विचार समान है: कुछ सरणी में एक त्रुटि संख्या से एक मैपिंग होती है जो एक स्ट्रिंग अधिकतम लंबाई 1024 बाइट्स तक होती है।

अन्य कार्यान्वयन:

+0

विषय से हटकर .. कैसे जटिल दूसरी कड़ी का कार्यान्वयन है। – Jack

+1

@jack alot +10000 – 0x90

+1

अंतिम लिंक के अलावा, आपकी सभी जानकारी छात्रों की ओएस परियोजनाओं से आती है। –