2012-04-02 16 views
7

का आंतरिक काम मैं मानक सी पुस्तकालय के आंतरिक काम में रूचि रखता हूं। मुझे एक संभावित कार्यान्वयन के बारे में अच्छी किताब मिली - लेकिन मैं पूरी मानक लाइब्रेरी और मानक (जैसे पीओएसईक्स) की गहराई से स्पष्टीकरण की तलाश कर रहा हूं - मानक पुस्तकालय में इन मानकों की परिभाषा।सी मानक पुस्तकालय

सी ड्राफ्ट बहुत उपयोगी हैं लेकिन पढ़ने के लिए बहुत अच्छा नहीं है। क्या इस विषय के बारे में कोई अन्य साहित्य है?

  • स्टैंडर्ड पुस्तकालय-पी.जे.-Plauger 1991
  • FreeBSD
  • जीएनयू आदमी
  • सी मसौदा (रों)

Albertus

+7

कृपया फिर से खोलें। यह एकतरफा बंद करना मॉडरेटर शक्ति का दुरुपयोग था। मेरा मानना ​​है कि यह सवाल पूरी तरह से उचित है, एसओ प्रारूप में उत्तरदायी है, और वास्तव में मेरे पास एक उत्तर है जिसे मुझे दुर्भाग्यपूर्ण एकपक्षीय निर्णय को बंद करने से अवरुद्ध कर दिया गया था। –

+0

@ आर ..: ठीक है, ऐसा लगता है कि सवाल अब खुला है, आपको यहां टैग कर रहा है ताकि आपको एक अधिसूचना मिल सके और देखें कि प्रश्न फिर से खोला गया था =) – cha0site

+0

@ cha0site: धन्यवाद! –

उत्तर

6

एक अच्छा प्रारंभिक बिंदु पॉज़िक्स होगा। POSIX 2008 विनिर्देश यहाँ ऑनलाइन उपलब्ध है:

http://pubs.opengroup.org/onlinepubs/9699919799/

यह और अधिक सुलभ (लेकिन कभी कभी कम कठोर) सी मानक की तुलना में है, और सिर्फ सी मानक, यानी के मानकीकृत भागों के सबसे तुलना में बहुत अधिक शामिल किया गया यूनिक्स की तरह सिस्टम 'मानक पुस्तकालयों।

यदि आप कार्यान्वयन में रुचि रखते हैं, तो पहली बात यह जानना है कि POSIX- वर्णित व्यवहार आमतौर पर कर्नेल कार्यान्वयन और उपयोगकर्तास्पेस libc कार्यान्वयन के बीच विभाजित (व्यावहारिक और व्यावहारिक कारणों से) होता है। POSIX (और सी मानक से कुछ) में फ़ंक्शंस की एक बड़ी संख्या केवल "सिस्टम कॉल" के लिए रैपर होगी, यानी अनुरोध की सेवा के लिए कर्नलस्पेस में संक्रमण। कुछ libc कार्यान्वयन पर, इन रैपरों को भी ढूंढना मुश्किल होगा, क्योंकि वे अक्सर बिल्ड स्क्रिप्ट द्वारा स्वचालित रूप से जेनरेट होते हैं, और/या एक असेंबली-भाषा फ़ाइल में एकीकृत होते हैं।

प्रमुख (गैर कर्नेल कोड के महत्वपूर्ण राशि) मानक पुस्तकालय के उप आम तौर पर कर रहे हैं:

  • stdio: glibc पर, यह जीएनयू libio पुस्तकालय, सी का एक एकीकृत कार्यान्वयन है जिसके द्वारा कार्यान्वित किया जाता है stdio और C++ iostream, अनुकूलित किया गया है ताकि दूसरे के लिए एक रैपर होने से न तो धीमा हो। यह एक बड़ा हैक है, और कोड ढूंढना और पालन करना मुश्किल है। अन्य कार्यान्वयन (विशेष रूप से बीएसडी, लेकिन लिनक्स पर अन्य libcs) पढ़ने के लिए बहुत सरल और स्पष्ट हैं। आखिरकार वे अंतर्निहित फाइल-डिस्क्रिप्टर आईओ फ़ंक्शंस जैसे open, read, आदि पर आधारित हैं
  • पॉज़िक्स धागे: ग्लिब और आधुनिक यूक्लिब पर, यह एनपीटीएल है। मैं बीएसडी के धागे कार्यान्वयन से परिचित नहीं हूं। अन्य लिनक्स libcs ​​या तो धागे की कमी है या मुख्य रूप से लिनक्स clone और futex syscalls पर आधारित अपने स्वयं के कार्यान्वयन प्रदान करते हैं।
  • मठ पुस्तकालय: आखिरकार, इनमें से लगभग सभी पुराने सन गणित कोड पर 90 के दशक के प्रारंभ से आधारित हैं, लेकिन वे बहुत अलग हो गए हैं। Fdlibm आधुनिक libcs ​​में उपयोग किए गए कोड का एक बहुत अच्छा आधार अनुमान है।
  • उपयोगकर्ता, समूह, होस्टनाम (DNS), आदि लुकअप: यह glibss में libnss के माध्यम से और सीधे अन्य अधिकांश libcs ​​में संभाला जाता है।
  • नियमित अभिव्यक्ति और मिलान
  • समय ग्लोब और समय क्षेत्र से निपटने
  • लोकेल और चारसेट रूपांतरण
  • Malloc

आप स्रोतों पढ़ने आरंभ करने के लिए चाहते हैं, तो मैं glibc के साथ शुरू नहीं की सिफारिश करेंगे। यह बहुत बड़ा और अनावश्यक है। यदि आप glibc को पढ़ना चाहते हैं, तो ध्यान रखें कि बहुत से कोड sysdeps पेड़ों के नीचे छिपा रहे हैं और यह उन प्रणालियों की विविधता के आधार पर व्यवस्थित है जो यह लागू है।

dietlibc काफी पठनीय है, लेकिन अगर आप अपने स्रोत से पढ़ते हैं, जानते हैं कि यह (जैसे int जहां size_t की जरूरत है, आदि का उपयोग कर अतिप्रवाह के लिए जाँच नहीं,) आम सी प्रोग्रामिंग गलतियों से भरा हुआ है हो सकता है। यदि आप इसे ध्यान में रखते हैं, तो यह एक खराब विकल्प नहीं हो सकता है, क्योंकि बहुत से संभावित त्रुटियों/असफलताओं को अनदेखा करना कोड को बहुत सरल बना देता है।

इसके साथ, libc स्रोत पढ़ने के लिए, मैं सबसे अधिक बीएसडी या musl (अस्वीकरण: मैं musl का प्राथमिक लेखक हूँ इसलिए मैं थोड़ा पक्षपातपूर्ण हूँ) की सिफारिश करता हूं। बीएसडी का भी लाभ है कि कर्नेलस्पेस कोड भी बेहद सरल और पठनीय है, इसलिए यदि आप सिस्टम कॉल के दूसरी तरफ कर्नेल कोड पढ़ना चाहते हैं, तो आप भी ऐसा कर सकते हैं।

+0

हाय इस दिलचस्प उत्तर (और अनब्लॉकिंग) के लिए धन्यवाद। POSIX विनिर्देश से थोड़ा सा पढ़ने के बाद मैंने देखा, कि यह दस्तावेज सी मानक से पढ़ने के लिए बहुत आसान है, क्योंकि यह मानक परिभाषा पर केंद्रित है। मेरे लिए, बीएसडी स्रोत पृष्ठ/दस्तावेज़ीकरण और musl-library प्रोजेक्ट दो अच्छे स्टार्ट-पॉइंट हैं। इन पुस्तकालयों से सिस्कल बैकएंड भी दिलचस्प है। अल्बर्टस – swaechter

+0

सी स्टडीओ और सी ++ iostream_ के कार्यान्वित कार्यान्वयन - 'g ++' अपने 'iostream' कार्यान्वयन' प्रदान नहीं करता है? –

+0

@ मैक्सिम: हाँ, लेकिन यह डिज़ाइन किया गया है ताकि कक्षाओं का बाइनरी लेआउट ग्लिबैक स्टडीओ में structs के बाइनरी लेआउट जैसा ही हो, और इसी मामले में दोनों के लिए समान वस्तुओं का उपयोग किया जाता है ... –

5

'सी में: एक संदर्भ मैनुअल, पांचवें संस्करण "Harbison द्वारा & स्टील, पुस्तक का दूसरा भाग सी मानक पुस्तकालय (भाग 2: अध्याय 10-24) को समर्पित है।

http://careferencemanual.com

C99 के लिए तर्क दस्तावेज़ सी पुस्तकालय लेकिन एएनएसआई C89 दलील अपने अध्याय 4 में शामिल किया गया है यहाँ दस्तावेज़ की एक प्रतिलिपि नहीं है को कवर नहीं किया:

http://www.lysator.liu.se/c/rat/title.html

+0

हाय उत्तर के लिए धन्यवाद, सी 8 9 "परिभाषा" के बारे में विषय एक अच्छी मदद है। – swaechter

संबंधित मुद्दे