सी मानक लाइब्रेरी: Difference between revisions

From Vigyanwiki
(Created page with "{{Short description|Standard library for the C programming language}} {{C Standard Library}} C मानक पुस्तकालय या libc, C (प्रोग्...")
 
No edit summary
Line 1: Line 1:
{{Short description|Standard library for the C programming language}}
{{Short description|Standard library for the C programming language}}
{{C Standard Library}}
{{C Standard Library}}
C [[मानक पुस्तकालय]] या libc, C (प्रोग्रामिंग भाषा) के लिए मानक पुस्तकालय है, जैसा कि [[ISO C]] मानक में निर्दिष्ट है।<ref name="c17io">[[International Organization for Standardization|ISO]]/[[International Electrotechnical Commission|IEC]] (2018). ''[[C17_(C_standard_revision)|ISO/IEC 9899:2018(E): Programming Languages - C]] §7''</ref> मूल [[एएनएसआई सी]] मानक से शुरू होकर, इसे उसी समय [[सी पॉज़िक्स लाइब्रेरी]] के रूप में विकसित किया गया था, जो इसका एक सुपरसेट है।<ref>{{cite web
C [[मानक पुस्तकालय]] या libc, C (प्रोग्रामिंग भाषा) के लिए मानक पुस्तकालय है, जैसा कि [[ISO C]] मानक में निर्दिष्ट है।<ref name="c17io">[[International Organization for Standardization|ISO]]/[[International Electrotechnical Commission|IEC]] (2018). ''[[C17_(C_standard_revision)|ISO/IEC 9899:2018(E): Programming Languages - C]] §7''</ref> मूल [[एएनएसआई सी]] मानक से प्रारंभ होकर, इसे उसी समय [[सी पॉज़िक्स लाइब्रेरी]] के रूप में विकसित किया गया था, जो इसका एक सुपरसेट है।<ref>{{cite web
  | url = http://ftp.gnu.org/old-gnu/Manuals/glibc-2.2.3/html_chapter/libc_1.html
  | url = http://ftp.gnu.org/old-gnu/Manuals/glibc-2.2.3/html_chapter/libc_1.html
  | title = The GNU C Library – Introduction
  | title = The GNU C Library – Introduction
Line 87: Line 87:
शीर्षलेख फ़ाइलों में से तीन (<code>complex.h</code>, <code>stdatomic.h</code>, और <code>threads.h</code>) सशर्त विशेषताएं हैं जिनका समर्थन करने के लिए कार्यान्वयन की आवश्यकता नहीं है।
शीर्षलेख फ़ाइलों में से तीन (<code>complex.h</code>, <code>stdatomic.h</code>, और <code>threads.h</code>) सशर्त विशेषताएं हैं जिनका समर्थन करने के लिए कार्यान्वयन की आवश्यकता नहीं है।


[[POSIX]] मानक ने यूनिक्स-विशिष्ट कार्यक्षमता के लिए कई गैर-मानक C हेडर जोड़े। कई ने अन्य आर्किटेक्चर के लिए अपना रास्ता खोज लिया है। उदाहरणों में शामिल <code>[[fcntl.h]]</code> और <code>[[unistd.h]]</code>. कई अन्य समूह अन्य गैर-मानक शीर्षलेखों का उपयोग कर रहे हैं - [[जीएनयू सी लाइब्रेरी]] में है <code>alloca.h</code>, और HP [[OpenVMS]] के पास है <code>va_count()</code> समारोह।
[[POSIX]] मानक ने यूनिक्स-विशिष्ट कार्यक्षमता के लिए कई गैर-मानक C हेडर जोड़े। कई ने अन्य आर्किटेक्चर के लिए अपना रास्ता खोज लिया है। उदाहरणों में सम्मिलित <code>[[fcntl.h]]</code> और <code>[[unistd.h]]</code>. कई अन्य समूह अन्य गैर-मानक शीर्षलेखों का उपयोग कर रहे हैं - [[जीएनयू सी लाइब्रेरी]] में है <code>alloca.h</code>, और HP [[OpenVMS]] के पास है <code>va_count()</code> समारोह।


=== दस्तावेज़ ===
=== दस्तावेज़ ===
Line 93: Line 93:


== कार्यान्वयन ==
== कार्यान्वयन ==
यूनिक्स जैसी प्रणालियों में आम तौर पर साझा लाइब्रेरी के रूप में एक सी लाइब्रेरी होती है, लेकिन हेडर फाइलें (और कंपाइलर टूलचैन) एक इंस्टॉलेशन से अनुपस्थित हो सकती हैं, इसलिए सी विकास संभव नहीं हो सकता है। सी लाइब्रेरी को यूनिक्स जैसी प्रणालियों पर ऑपरेटिंग सिस्टम का हिस्सा माना जाता है। आईएसओ सी मानक वाले सी कार्यों का व्यापक रूप से कार्यक्रमों द्वारा उपयोग किया जाता है, और माना जाता है कि वे न केवल सी भाषा में कुछ का कार्यान्वयन थे, बल्कि ऑपरेटिंग सिस्टम इंटरफ़ेस का वास्तविक हिस्सा भी थे। यदि सी लाइब्रेरी मिटा दी जाती है तो यूनिक्स-जैसी ऑपरेटिंग सिस्टम आम तौर पर काम नहीं कर सकते हैं। यह उन अनुप्रयोगों के लिए सही है जो स्थिर रूप से जुड़े होने के विपरीत गतिशील हैं। इसके अलावा, स्वयं कर्नेल (लिनक्स के मामले में कम से कम) किसी भी पुस्तकालय से स्वतंत्र रूप से संचालित होता है।
यूनिक्स जैसी प्रणालियों में सामान्यतः साझा लाइब्रेरी के रूप में एक सी लाइब्रेरी होती है, लेकिन हेडर फाइलें (और कंपाइलर टूलचैन) एक इंस्टॉलेशन से अनुपस्थित हो सकती हैं, इसलिए सी विकास संभव नहीं हो सकता है। सी लाइब्रेरी को यूनिक्स जैसी प्रणालियों पर ऑपरेटिंग सिस्टम का हिस्सा माना जाता है। आईएसओ सी मानक वाले सी कार्यों का व्यापक रूप से कार्यक्रमों द्वारा उपयोग किया जाता है, और माना जाता है कि वे न केवल सी भाषा में कुछ का कार्यान्वयन थे, बल्कि ऑपरेटिंग सिस्टम इंटरफ़ेस का वास्तविक हिस्सा भी थे। यदि सी लाइब्रेरी मिटा दी जाती है तो यूनिक्स-जैसी ऑपरेटिंग सिस्टम सामान्यतः काम नहीं कर सकते हैं। यह उन अनुप्रयोगों के लिए सही है जो स्थिर रूप से जुड़े होने के विपरीत गतिशील हैं। इसके अतिरिक्त, स्वयं कर्नेल (लिनक्स के स्थितिमें कम से कम) किसी भी पुस्तकालय से स्वतंत्र रूप से संचालित होता है।


Microsoft Windows पर, कोर सिस्टम डायनेमिक लाइब्रेरी ([[डायनेमिक-लिंक लाइब्रेरी]]) Microsoft Visual C++ कंपाइलर v6.0 के लिए C मानक लाइब्रेरी का कार्यान्वयन प्रदान करती है; Microsoft Visual C++ कंपाइलर के नए संस्करणों के लिए C मानक लाइब्रेरी प्रत्येक कंपाइलर द्वारा व्यक्तिगत रूप से, साथ ही पुनर्वितरण योग्य पैकेज द्वारा प्रदान की जाती है। C में लिखे गए संकलित अनुप्रयोग या तो स्थिर रूप से C लाइब्रेरी से जुड़े होते हैं, [[साझा पुस्तकालय]] के एक गतिशील संस्करण से जुड़े होते हैं, जो लक्षित सिस्टम पर मौजूद होने के बजाय इन अनुप्रयोगों के साथ भेजे जाते हैं। कंपाइलर की C लाइब्रेरी में फ़ंक्शंस को Microsoft Windows के इंटरफ़ेस के रूप में नहीं माना जाता है।
Microsoft Windows पर, कोर सिस्टम डायनेमिक लाइब्रेरी ([[डायनेमिक-लिंक लाइब्रेरी]]) Microsoft Visual C++ कंपाइलर v6.0 के लिए C मानक लाइब्रेरी का कार्यान्वयन प्रदान करती है; Microsoft Visual C++ कंपाइलर के नए संस्करणों के लिए C मानक लाइब्रेरी प्रत्येक कंपाइलर द्वारा व्यक्तिगत रूप से, साथ ही पुनर्वितरण योग्य पैकेज द्वारा प्रदान की जाती है। C में लिखे गए संकलित अनुप्रयोग या तो स्थिर रूप से C लाइब्रेरी से जुड़े होते हैं, [[साझा पुस्तकालय]] के एक गतिशील संस्करण से जुड़े होते हैं, जो लक्षित सिस्टम पर उपस्तिथ होने के अतिरिक्त इन अनुप्रयोगों के साथ भेजे जाते हैं। कंपाइलर की C लाइब्रेरी में फ़ंक्शंस को Microsoft Windows के इंटरफ़ेस के रूप में नहीं माना जाता है।


कई अन्य कार्यान्वयन मौजूद हैं, जो विभिन्न ऑपरेटिंग सिस्टम और सी कंपाइलर दोनों के साथ उपलब्ध हैं। कुछ लोकप्रिय कार्यान्वयन निम्नलिखित हैं:
कई अन्य कार्यान्वयन उपस्तिथ हैं, जो विभिन्न ऑपरेटिंग सिस्टम और सी कंपाइलर दोनों के साथ उपलब्ध हैं। कुछ लोकप्रिय कार्यान्वयन निम्नलिखित हैं:


* बीएसडी लिबक, [[बर्कले सॉफ्टवेयर वितरण]]-व्युत्पन्न ऑपरेटिंग सिस्टम के साथ वितरित विभिन्न कार्यान्वयन
* बीएसडी लिबक, [[बर्कले सॉफ्टवेयर वितरण]]-व्युत्पन्न ऑपरेटिंग सिस्टम के साथ वितरित विभिन्न कार्यान्वयन
Line 112: Line 112:


=== कंपाइलर बिल्ट-इन फ़ंक्शंस ===
=== कंपाइलर बिल्ट-इन फ़ंक्शंस ===
कुछ संकलक (उदाहरण के लिए, GNU संकलक संग्रह<ref>[https://gcc.gnu.org/onlinedocs/gcc-4.1.1/gcc/Other-Builtins.html#Other-Builtins Other built-in functions provided by GCC], GCC Manual</ref>) सी मानक पुस्तकालय में कई कार्यों के अंतर्निर्मित संस्करण प्रदान करें; अर्थात्, कार्यों के कार्यान्वयन को संकलित [[वस्तु फ़ाइल]] में लिखा गया है, और प्रोग्राम सी लाइब्रेरी साझा ऑब्जेक्ट फ़ाइल में फ़ंक्शंस के बजाय अंतर्निहित संस्करणों को कॉल करता है। यह फ़ंक्शन-कॉल ओवरहेड को कम करता है, खासकर यदि फ़ंक्शन कॉल को [[इनलाइन फ़ंक्शन]] वेरिएंट के साथ बदल दिया जाता है, और [[संकलक अनुकूलन]] के अन्य रूपों की अनुमति देता है (जैसा कि कंपाइलर [[बहाव को काबू करें]] जानता है। बिल्ट-इन वेरिएंट की कंट्रोल-फ्लो विशेषताओं), लेकिन भ्रम पैदा कर सकता है जब डिबगिंग (उदाहरण के लिए, अंतर्निहित संस्करणों को [[इंस्ट्रूमेंटेशन (कंप्यूटर प्रोग्रामिंग)]] वेरिएंट से बदला नहीं जा सकता)।
कुछ संकलक (उदाहरण के लिए, GNU संकलक संग्रह<ref>[https://gcc.gnu.org/onlinedocs/gcc-4.1.1/gcc/Other-Builtins.html#Other-Builtins Other built-in functions provided by GCC], GCC Manual</ref>) सी मानक पुस्तकालय में कई कार्यों के अंतर्निर्मित संस्करण प्रदान करें; अर्थात्, कार्यों के कार्यान्वयन को संकलित [[वस्तु फ़ाइल]] में लिखा गया है, और प्रोग्राम सी लाइब्रेरी साझा ऑब्जेक्ट फ़ाइल में फ़ंक्शंस के अतिरिक्त अंतर्निहित संस्करणों को कॉल करता है। यह फ़ंक्शन-कॉल ओवरहेड को कम करता है, खासकर यदि फ़ंक्शन कॉल को [[इनलाइन फ़ंक्शन]] वेरिएंट के साथ बदल दिया जाता है, और [[संकलक अनुकूलन]] के अन्य रूपों की अनुमति देता है (जैसा कि कंपाइलर [[बहाव को काबू करें]] जानता है। बिल्ट-इन वेरिएंट की कंट्रोल-फ्लो विशेषताओं), लेकिन भ्रम उत्पन्न कर सकता है जब डिबगिंग (उदाहरण के लिए, अंतर्निहित संस्करणों को [[इंस्ट्रूमेंटेशन (कंप्यूटर प्रोग्रामिंग)]] वेरिएंट से बदला नहीं जा सकता)।


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


=== लिंकिंग, libm ===
=== लिंकिंग, libm ===


फ्रीबीएसडी के तहत<ref>{{cite web|title=Compiling with cc|url=http://www.freebsd.org/doc/en_US.ISO8859-1/books/developers-handbook/tools-compiling.html|access-date=2013-03-02}}</ref> और ग्लिबैक,<ref>{{cite web |last1=Weimer |first1=Florian |title=c - What functions is the libm intended for? |url=https://stackoverflow.com/questions/54054925/what-functions-is-the-libm-intended-for |website=Stack Overflow |access-date=24 February 2021}}</ref> कुछ फ़ंक्शन जैसे पाप () डिफ़ॉल्ट रूप से लिंक नहीं होते हैं और इसके बजाय गणितीय पुस्तकालय [[libm]] में बंडल किए जाते हैं। यदि उनमें से किसी का उपयोग किया जाता है, तो लिंकर को निर्देश दिया जाना चाहिए <code>-lm</code>. POSIX के लिए आवश्यक है कि c99 कंपाइलर समर्थन करे <code>-lm</code>, और यह कि हेडर में घोषित किए गए कार्य <code>math.h</code>, <code>complex.h</code>, और <code>fenv.h</code> लिंक करने के लिए उपलब्ध हैं अगर <code>-lm</code> निर्दिष्ट है, लेकिन यह निर्दिष्ट नहीं करता है कि फ़ंक्शन डिफ़ॉल्ट रूप से लिंक किए गए हैं या नहीं।<ref>{{cite web |title=c99 - compile standard C programs |url=https://pubs.opengroup.org/onlinepubs/9699919799/utilities/c99.html |website=The Open Group Base Specifications Issue 7, 2018 edition |publisher=The Open Group |access-date=24 February 2021}}</ref> musl सब कुछ एक ही libc लाइब्रेरी में डालकर और एक खाली libm प्रदान करके इस आवश्यकता को पूरा करता है।<ref>{{cite web |title=musl FAQ |url=https://www.musl-libc.org/faq.html |website=www.musl-libc.org |access-date=24 February 2021}}</ref>
फ्रीबीएसडी के अनुसार <ref>{{cite web|title=Compiling with cc|url=http://www.freebsd.org/doc/en_US.ISO8859-1/books/developers-handbook/tools-compiling.html|access-date=2013-03-02}}</ref> और ग्लिबैक,<ref>{{cite web |last1=Weimer |first1=Florian |title=c - What functions is the libm intended for? |url=https://stackoverflow.com/questions/54054925/what-functions-is-the-libm-intended-for |website=Stack Overflow |access-date=24 February 2021}}</ref> कुछ फ़ंक्शन जैसे पाप () डिफ़ॉल्ट रूप से लिंक नहीं होते हैं और इसके अतिरिक्त गणितीय पुस्तकालय [[libm]] में बंडल किए जाते हैं। यदि उनमें से किसी का उपयोग किया जाता है, तो लिंकर को निर्देश दिया जाना चाहिए <code>-lm</code>. POSIX के लिए आवश्यक है कि c99 कंपाइलर समर्थन करे <code>-lm</code>, और यह कि हेडर में घोषित किए गए कार्य <code>math.h</code>, <code>complex.h</code>, और <code>fenv.h</code> लिंक करने के लिए उपलब्ध हैं यदि <code>-lm</code> निर्दिष्ट है, लेकिन यह निर्दिष्ट नहीं करता है कि फ़ंक्शन डिफ़ॉल्ट रूप से लिंक किए गए हैं या नहीं।<ref>{{cite web |title=c99 - compile standard C programs |url=https://pubs.opengroup.org/onlinepubs/9699919799/utilities/c99.html |website=The Open Group Base Specifications Issue 7, 2018 edition |publisher=The Open Group |access-date=24 February 2021}}</ref> musl सब कुछ एक ही libc लाइब्रेरी में डालकर और एक खाली libm प्रदान करके इस आवश्यकता को पूरा करता है।<ref>{{cite web |title=musl FAQ |url=https://www.musl-libc.org/faq.html |website=www.musl-libc.org |access-date=24 February 2021}}</ref>




=== पता लगाना ===
=== पता लगाना ===
सी मानक के अनुसार मैक्रो <code>__STDC_HOSTED__</code> कार्यान्वयन की मेजबानी होने पर 1 को परिभाषित किया जाएगा। एक होस्टेड कार्यान्वयन में सी मानक द्वारा निर्दिष्ट सभी शीर्षलेख हैं। कार्यान्वयन ''फ्रीस्टैंडिंग'' भी हो सकता है, जिसका अर्थ है कि ये हेडर मौजूद नहीं होंगे। यदि कार्यान्वयन 'फ्रीस्टैंडिंग' है, तो यह परिभाषित करेगा <code>__STDC_HOSTED__</code> से 0.
सी मानक के अनुसार मैक्रो <code>__STDC_HOSTED__</code> कार्यान्वयन की मेजबानी होने पर 1 को परिभाषित किया जाएगा। एक होस्टेड कार्यान्वयन में सी मानक द्वारा निर्दिष्ट सभी शीर्षलेख हैं। कार्यान्वयन ''फ्रीस्टैंडिंग'' भी हो सकता है, जिसका अर्थ है कि ये हेडर उपस्तिथ नहीं होंगे। यदि कार्यान्वयन 'फ्रीस्टैंडिंग' है, तो यह परिभाषित करेगा <code>__STDC_HOSTED__</code> से 0.


== समस्याएं और समाधान ==
== समस्याएं और समाधान ==


=== {{Anchor|BUFFER-OVERFLOW}}[[बफ़र अधिकता]] भेद्यता ===
=== {{Anchor|BUFFER-OVERFLOW}}[[बफ़र अधिकता]] भेद्यता ===
सी मानक पुस्तकालय में कुछ कार्य बफर अतिप्रवाह कमजोरियों के लिए कुख्यात रहे हैं और आम तौर पर बग्गी प्रोग्रामिंग को उनके गोद लेने के बाद से प्रोत्साहित करते हैं।{{efn|[[Morris worm]] that takes advantage of the well-known vulnerability in <code>gets()</code> have been created as early as in 1988.}} सबसे अधिक आलोचना वाली वस्तुएँ हैं:
सी मानक पुस्तकालय में कुछ कार्य बफर अतिप्रवाह कमजोरियों के लिए कुख्यात रहे हैं और सामान्यतः बग्गी प्रोग्रामिंग को उनके गोद लेने के बाद से प्रोत्साहित करते हैं।{{efn|[[Morris worm]] that takes advantage of the well-known vulnerability in <code>gets()</code> have been created as early as in 1988.}} सबसे अधिक आलोचना वाली वस्तुएँ हैं:
* [[सी स्ट्रिंग हैंडलिंग]] | स्ट्रिंग-मैनिपुलेशन रूटीन, सहित <code>strcpy()</code> और <code>strcat()</code>, [[सीमा जाँच]] की कमी और संभावित बफर ओवरफ़्लो के लिए यदि सीमाएँ मैन्युअल रूप से जाँची नहीं जाती हैं;
* [[सी स्ट्रिंग हैंडलिंग]] | स्ट्रिंग-मैनिपुलेशन रूटीन, सहित <code>strcpy()</code> और <code>strcat()</code>, [[सीमा जाँच]] की कमी और संभावित बफर ओवरफ़्लो के लिए यदि सीमाएँ मैन्युअल रूप से जाँची नहीं जाती हैं;
* [[साइड इफेक्ट (कंप्यूटर विज्ञान)]] के लिए सामान्य रूप से स्ट्रिंग रूटीन | साइड-इफेक्ट्स, गैर-जिम्मेदार बफर उपयोग को प्रोत्साहित करना, हमेशा वैध [[अशक्त-समाप्त स्ट्रिंग]] की गारंटी नहीं देना।{{efn|in C standard library, string length calculation and looking for a string's end have [[Linear time|linear time complexities]] and are inefficient when used on the same or related strings repeatedly}}
* [[साइड इफेक्ट (कंप्यूटर विज्ञान)]] के लिए सामान्य रूप से स्ट्रिंग रूटीन | साइड-इफेक्ट्स, गैर-जिम्मेदार बफर उपयोग को प्रोत्साहित करना, हमेशा वैध [[अशक्त-समाप्त स्ट्रिंग]] की गारंटी नहीं देना।{{efn|in C standard library, string length calculation and looking for a string's end have [[Linear time|linear time complexities]] and are inefficient when used on the same or related strings repeatedly}}
Line 133: Line 133:
* <code>[[gets()|gets]]()</code> और <code>[[scanf]]()</code> I/O रूटीन का परिवार, (या तो कोई या आसान) इनपुट लंबाई जाँच की कमी के लिए।
* <code>[[gets()|gets]]()</code> और <code>[[scanf]]()</code> I/O रूटीन का परिवार, (या तो कोई या आसान) इनपुट लंबाई जाँच की कमी के लिए।


के साथ चरम मामले को छोड़कर <code>gets()</code>मेमोरी मैनेजमेंट, बाउंड चेकिंग, इनपुट चेकिंग आदि करने के लिए सहायक कोड शुरू करके सभी सुरक्षा कमजोरियों से बचा जा सकता है। यह अक्सर रैपर के रूप में किया जाता है जो मानक लाइब्रेरी फ़ंक्शंस को सुरक्षित और उपयोग में आसान बनाता है। यह बी. कर्निघन और आर. पाइक की [[प्रोग्रामिंग का अभ्यास]] पुस्तक के समय से पहले का है, जहां लेखक आमतौर पर रैपर का उपयोग करते हैं जो त्रुटि संदेशों को प्रिंट करते हैं और यदि कोई त्रुटि होती है तो प्रोग्राम को छोड़ देते हैं।
के साथ चरम स्थितिको छोड़कर <code>gets()</code>मेमोरी मैनेजमेंट, बाउंड चेकिंग, इनपुट चेकिंग आदि करने के लिए सहायक कोड प्रारंभ करके सभी सुरक्षा कमजोरियों से बचा जा सकता है। यह अधिकांशतः रैपर के रूप में किया जाता है जो मानक लाइब्रेरी फ़ंक्शंस को सुरक्षित और उपयोग में आसान बनाता है। यह बी. कर्निघन और आर. पाइक की [[प्रोग्रामिंग का अभ्यास]] पुस्तक के समय से पहले का है, जहां लेखक सामान्यतः रैपर का उपयोग करते हैं जो त्रुटि संदेशों को प्रिंट करते हैं और यदि कोई त्रुटि होती है तो प्रोग्राम को छोड़ देते हैं।


आईएसओ सी समिति ने तकनीकी रिपोर्ट टीआर 24731-1 प्रकाशित की<ref>{{cite web
आईएसओ सी समिति ने तकनीकी रिपोर्ट टीआर 24731-1 प्रकाशित की<ref>{{cite web
Line 148: Line 148:


=== त्रुटि प्रबंधन ===
=== त्रुटि प्रबंधन ===
सी मानक पुस्तकालय में कार्यों की त्रुटि प्रबंधन संगत नहीं है और कभी-कभी भ्रमित होती है। लिनक्स मैनुअल पेज के मुताबिक <code>math_error</code>, ग्लिबैक के तहत वर्तमान (संस्करण 2.8) स्थिति गड़बड़ है। अधिकांश (लेकिन सभी नहीं) फ़ंक्शन त्रुटियों पर अपवाद उठाते हैं। कुछ ने इरनो भी सेट किया। कुछ फ़ंक्शन इरनो सेट करते हैं, लेकिन अपवाद नहीं बढ़ाते हैं। बहुत कम कार्य न तो करते हैं।<ref>{{cite web
सी मानक पुस्तकालय में कार्यों की त्रुटि प्रबंधन संगत नहीं है और कभी-कभी भ्रमित होती है। लिनक्स मैनुअल पेज के मुताबिक <code>math_error</code>, ग्लिबैक के अनुसार  वर्तमान (संस्करण 2.8) स्थिति गड़बड़ है। अधिकांश (लेकिन सभी नहीं) फ़ंक्शन त्रुटियों पर अपवाद उठाते हैं। कुछ ने इरनो भी सेट किया। कुछ फ़ंक्शन इरनो सेट करते हैं, लेकिन अपवाद नहीं बढ़ाते हैं। बहुत कम कार्य न तो करते हैं।<ref>{{cite web
  | url = http://man7.org/linux/man-pages/man7/math_error.7.html
  | url = http://man7.org/linux/man-pages/man7/math_error.7.html
  | title = math_error - detecting errors from mathematical functions
  | title = math_error - detecting errors from mathematical functions
Line 158: Line 158:
== मानकीकरण ==
== मानकीकरण ==
{{Main article|C (programming language)#History|l1=C (programming language) § History}}
{{Main article|C (programming language)#History|l1=C (programming language) § History}}
[[COBOL]] और [[फोरट्रान]] जैसी पारंपरिक भाषाओं के विपरीत, मूल C (प्रोग्रामिंग भाषा) ने I/O संचालन जैसे कोई अंतर्निहित कार्य प्रदान नहीं किए।{{Citation needed|date=November 2010}} समय के साथ, सी के उपयोगकर्ता समुदायों ने विचारों और कार्यान्वयन को साझा किया जिसे अब सी मानक पुस्तकालय कहा जाता है। इनमें से कई विचारों को अंततः मानकीकृत सी भाषा की परिभाषा में शामिल किया गया।
[[COBOL]] और [[फोरट्रान]] जैसी पारंपरिक भाषाओं के विपरीत, मूल C (प्रोग्रामिंग भाषा) ने I/O संचालन जैसे कोई अंतर्निहित कार्य प्रदान नहीं किए।{{Citation needed|date=November 2010}} समय के साथ, सी के उपयोगकर्ता समुदायों ने विचारों और कार्यान्वयन को साझा किया जिसे अब सी मानक पुस्तकालय कहा जाता है। इनमें से कई विचारों को अंततः मानकीकृत सी भाषा की परिभाषा में सम्मिलित किया गया।


[[यूनिक्स]] और सी दोनों को 1960 के दशक के अंत और 1970 के दशक के प्रारंभ में बेल लैब्स | एटी एंड टी की बेल प्रयोगशालाओं में बनाया गया था। 1970 के दशक के दौरान सी भाषा तेजी से लोकप्रिय हुई। कई विश्वविद्यालयों और संगठनों ने अपनी स्वयं की परियोजनाओं के लिए भाषा के अपने संस्करण बनाने शुरू कर दिए। 1980 के दशक की शुरुआत तक विभिन्न सी कार्यान्वयनों के बीच संगतता समस्याएं स्पष्ट हो गईं। 1983 में अमेरिकी राष्ट्रीय मानक संस्थान (एएनएसआई) ने एएनएसआई सी नामक सी के मानक विनिर्देश स्थापित करने के लिए एक समिति का गठन किया। यह कार्य 1989 में तथाकथित C89 मानक के निर्माण में समाप्त हुआ। परिणामी मानक का एक हिस्सा [[सॉफ्टवेयर पुस्तकालय]]ों का एक सेट था जिसे ANSI C मानक पुस्तकालय कहा जाता है।
[[यूनिक्स]] और सी दोनों को 1960 के दशक के अंत और 1970 के दशक के प्रारंभ में बेल लैब्स | एटी एंड टी की बेल प्रयोगशालाओं में बनाया गया था। 1970 के दशक के समय सी भाषा तेजी से लोकप्रिय हुई। कई विश्वविद्यालयों और संगठनों ने अपनी स्वयं की परियोजनाओं के लिए भाषा के अपने संस्करण बनाने प्रारंभ कर दिए। 1980 के दशक की शुरुआत तक विभिन्न सी कार्यान्वयनों के बीच संगतता समस्याएं स्पष्ट हो गईं। 1983 में अमेरिकी राष्ट्रीय मानक संस्थान (एएनएसआई) ने एएनएसआई सी नामक सी के मानक विनिर्देश स्थापित करने के लिए एक समिति का गठन किया। यह कार्य 1989 में तथाकथित C89 मानक के निर्माण में समाप्त हुआ। परिणामी मानक का एक हिस्सा [[सॉफ्टवेयर पुस्तकालय]]ों का एक सेट था जिसे ANSI C मानक पुस्तकालय कहा जाता है।


=== POSIX मानक पुस्तकालय ===
=== POSIX मानक पुस्तकालय ===
{{Main article|C POSIX library}}
{{Main article|C POSIX library}}
POSIX, साथ ही [[एकल यूनिक्स विशिष्टता]], कई रूटीनों को निर्दिष्ट करती है जो मूल C मानक लाइब्रेरी में उपलब्ध होने चाहिए। POSIX विनिर्देशन में अन्य उपयोगों के साथ-साथ POSIX थ्रेड्स|मल्टी-थ्रेडिंग, [[बर्कले सॉकेट]]्स और [[नियमित अभिव्यक्ति]] के लिए हेडर फाइलें शामिल हैं। इन्हें अक्सर सी मानक लाइब्रेरी कार्यक्षमता के साथ निकटता की अलग-अलग डिग्री के साथ कार्यान्वित किया जाता है। उदाहरण के लिए, ग्लिबैक जैसे कार्यों को लागू करता है <code>[[fork (operating system)|fork]]</code> अंदर <code>libc.so</code>, लेकिन [[एनपीटीएल]] को ग्लिबैक में मिलाने से पहले इसने अपने स्वयं के लिंकर फ़्लैग तर्क के साथ एक अलग पुस्तकालय का गठन किया। अक्सर, इस POSIX-निर्दिष्ट कार्यक्षमता को लाइब्रेरी के भाग के रूप में माना जाएगा; मूल सी पुस्तकालय को एएनएसआई या मानकीकरण सी पुस्तकालय के लिए अंतर्राष्ट्रीय संगठन के रूप में पहचाना जा सकता है।
POSIX, साथ ही [[एकल यूनिक्स विशिष्टता]], कई रूटीनों को निर्दिष्ट करती है जो मूल C मानक लाइब्रेरी में उपलब्ध होने चाहिए। POSIX विनिर्देशन में अन्य उपयोगों के साथ-साथ POSIX थ्रेड्स|मल्टी-थ्रेडिंग, [[बर्कले सॉकेट]]्स और [[नियमित अभिव्यक्ति]] के लिए हेडर फाइलें सम्मिलित हैं। इन्हें अधिकांशतः सी मानक लाइब्रेरी कार्यक्षमता के साथ निकटता की अलग-अलग डिग्री के साथ कार्यान्वित किया जाता है। उदाहरण के लिए, ग्लिबैक जैसे कार्यों को लागू करता है <code>[[fork (operating system)|fork]]</code> अंदर <code>libc.so</code>, लेकिन [[एनपीटीएल]] को ग्लिबैक में मिलाने से पहले इसने अपने स्वयं के लिंकर फ़्लैग तर्क के साथ एक अलग पुस्तकालय का गठन किया। अधिकांशतः, इस POSIX-निर्दिष्ट कार्यक्षमता को लाइब्रेरी के भाग के रूप में माना जाएगा; मूल सी पुस्तकालय को एएनएसआई या मानकीकरण सी पुस्तकालय के लिए अंतर्राष्ट्रीय संगठन के रूप में पहचाना जा सकता है।


=== [[बीएसडी]] libc ===
=== [[बीएसडी]] libc ===
BSD libc POSIX मानक पुस्तकालय का एक सुपरसेट है, जो BSD ऑपरेटिंग सिस्टम जैसे [[FreeBSD]], [[NetBSD]], [[OpenBSD]] और [[macOS]] के साथ शामिल C पुस्तकालयों द्वारा समर्थित है। बीएसडी लिबक में कुछ एक्सटेंशन हैं जो मूल मानक में परिभाषित नहीं हैं, जिनमें से कई पहली बार 1994 के बीएसडी#4.4बीएसडी और डिसेंडेंट्स|4.4बीएसडी रिलीज में दिखाई दिए (1989 में जारी किए गए पहले मानक के बाद बड़े पैमाने पर विकसित किए गए पहले)। BSD libc के कुछ विस्तार हैं:
BSD libc POSIX मानक पुस्तकालय का एक सुपरसेट है, जो BSD ऑपरेटिंग सिस्टम जैसे [[FreeBSD]], [[NetBSD]], [[OpenBSD]] और [[macOS]] के साथ सम्मिलित C पुस्तकालयों द्वारा समर्थित है। बीएसडी लिबक में कुछ एक्सटेंशन हैं जो मूल मानक में परिभाषित नहीं हैं, जिनमें से कई पहली बार 1994 के बीएसडी#4.4बीएसडी और डिसेंडेंट्स|4.4बीएसडी रिलीज में दिखाई दिए (1989 में जारी किए गए पहले मानक के बाद बड़े पैमाने पर विकसित किए गए पहले)। BSD libc के कुछ विस्तार हैं:


* <code>sys/tree.h</code>{{snd}} लाल-काले ट्री और [[पेड़ का पेड़]] का कार्यान्‍वयन शामिल है<ref>{{cite web|url=http://man.freebsd.org/tree|title=tree |website=Man.freebsd.org |date=2007-12-27 |access-date=2013-08-25}}</ref><ref>{{cite web|url=http://bxr.su/o/sys/sys/tree.h|title=Super User's BSD Cross Reference: /OpenBSD/sys/sys/tree.h|website=bxr.su}}</ref>
* <code>sys/tree.h</code>{{snd}} लाल-काले ट्री और [[पेड़ का पेड़]] का कार्यान्‍वयन सम्मिलित है<ref>{{cite web|url=http://man.freebsd.org/tree|title=tree |website=Man.freebsd.org |date=2007-12-27 |access-date=2013-08-25}}</ref><ref>{{cite web|url=http://bxr.su/o/sys/sys/tree.h|title=Super User's BSD Cross Reference: /OpenBSD/sys/sys/tree.h|website=bxr.su}}</ref>
* <code>sys/queue.h</code>{{snd}} [[लिंक्ड सूची]], [[कतार (डेटा संरचना)]], पूंछ कतार, आदि का कार्यान्वयन।<ref>{{cite web|url=http://man.freebsd.org/queue |title=queue |website=Man.freebsd.org |date=2011-05-13 |access-date=2013-08-25}}</ref><ref>{{cite web|url=http://bxr.su/o/sys/sys/queue.h|title=Super User's BSD Cross Reference: /OpenBSD/sys/sys/queue.h|website=bxr.su}}</ref>
* <code>sys/queue.h</code>{{snd}} [[लिंक्ड सूची]], [[कतार (डेटा संरचना)]], पूंछ कतार, आदि का कार्यान्वयन।<ref>{{cite web|url=http://man.freebsd.org/queue |title=queue |website=Man.freebsd.org |date=2011-05-13 |access-date=2013-08-25}}</ref><ref>{{cite web|url=http://bxr.su/o/sys/sys/queue.h|title=Super User's BSD Cross Reference: /OpenBSD/sys/sys/queue.h|website=bxr.su}}</ref>
* <code>fgetln()</code>{{snd}} में परिभाषित <code>stdio.h</code>. इसका उपयोग फ़ाइल लाइन को लाइन से पढ़ने के लिए किया जा सकता है।<ref>{{cite web|url=http://man.freebsd.org/fgetln |title=fgetln |website=Man.freebsd.org |date=1994-04-19 |access-date=2013-08-25}}</ref><ref>{{cite web|url=http://bxr.su/o/lib/libc/stdio/fgetln.c#fgetln|title=Super User's BSD Cross Reference: /OpenBSD/lib/libc/stdio/fgetln.c|website=bxr.su}}</ref><ref>{{cite web|url=http://bxr.su/o/include/stdio.h|title=Super User's BSD Cross Reference: /OpenBSD/include/stdio.h|website=bxr.su}}</ref>
* <code>fgetln()</code>{{snd}} में परिभाषित <code>stdio.h</code>. इसका उपयोग फ़ाइल लाइन को लाइन से पढ़ने के लिए किया जा सकता है।<ref>{{cite web|url=http://man.freebsd.org/fgetln |title=fgetln |website=Man.freebsd.org |date=1994-04-19 |access-date=2013-08-25}}</ref><ref>{{cite web|url=http://bxr.su/o/lib/libc/stdio/fgetln.c#fgetln|title=Super User's BSD Cross Reference: /OpenBSD/lib/libc/stdio/fgetln.c|website=bxr.su}}</ref><ref>{{cite web|url=http://bxr.su/o/include/stdio.h|title=Super User's BSD Cross Reference: /OpenBSD/include/stdio.h|website=bxr.su}}</ref>
* <code>fts.h</code>{{snd}} फ़ाइल पदानुक्रम को पार करने के लिए कुछ फ़ंक्शन शामिल हैं<ref>{{cite web|url=http://man.freebsd.org/फीट |title=फीट|website=Man.freebsd.org |date=2012-03-18 |access-date=2013-08-25}}</ref><ref>{{cite web|url=http://bxr.su/o/include/fts.h|title=Super User's BSD Cross Reference: /OpenBSD/include/fts.h|website=bxr.su}}</ref>
* <code>fts.h</code>{{snd}} फ़ाइल पदानुक्रम को पार करने के लिए कुछ फ़ंक्शन सम्मिलित हैं<ref>{{cite web|url=http://man.freebsd.org/फीट |title=फीट|website=Man.freebsd.org |date=2012-03-18 |access-date=2013-08-25}}</ref><ref>{{cite web|url=http://bxr.su/o/include/fts.h|title=Super User's BSD Cross Reference: /OpenBSD/include/fts.h|website=bxr.su}}</ref>
* <code>db.h</code>{{snd}} [[बर्कले डीबी]] से जुड़ने के लिए कुछ कार्य<ref>{{cite web|url=http://man.freebsd.org/डाटाबेस |title=डाटाबेस|website=Man.freebsd.org |date=2010-09-10 |access-date=2013-08-25}}</ref><ref>{{cite web|url=http://bxr.su/o/include/db.h|title=Super User's BSD Cross Reference: /OpenBSD/include/db.h|website=bxr.su}}</ref>
* <code>db.h</code>{{snd}} [[बर्कले डीबी]] से जुड़ने के लिए कुछ कार्य<ref>{{cite web|url=http://man.freebsd.org/डाटाबेस |title=डाटाबेस|website=Man.freebsd.org |date=2010-09-10 |access-date=2013-08-25}}</ref><ref>{{cite web|url=http://bxr.su/o/include/db.h|title=Super User's BSD Cross Reference: /OpenBSD/include/db.h|website=bxr.su}}</ref>
* <code>strlcat()</code> और <code>strlcpy()</code>{{snd}} के लिए सुरक्षित विकल्प <code>strncat()</code> और <code>strncpy()</code><ref>Miller, Todd C. and Theo de Raadt. [http://www.usenix.org/events/usenix99/millert.html strlcpy and strlcat - consistent, safe, string copy and concatenation]. Proceedings of the 1999 USENIX Annual Technical Conference, June 6–11, 1999, pp. 175–178.</ref><ref>{{cite web|url=http://bxr.su/o/lib/libc/string/strlcat.c|title=Super User's BSD Cross Reference: /OpenBSD/lib/libc/string/strlcat.c|website=bxr.su}}</ref><ref>{{cite web|url=http://bxr.su/o/lib/libc/string/strlcpy.c|title=Super User's BSD Cross Reference: /OpenBSD/lib/libc/string/strlcpy.c|website=bxr.su}}</ref><ref>{{cite web|url=http://bxr.su/o/lib/libc/string/strncat.c|title=Super User's BSD Cross Reference: /OpenBSD/lib/libc/string/strncat.c|website=bxr.su}}</ref><ref>{{cite web|url=http://bxr.su/o/lib/libc/string/strncpy.c|title=Super User's BSD Cross Reference: /OpenBSD/lib/libc/string/strncpy.c|website=bxr.su}}</ref>
* <code>strlcat()</code> और <code>strlcpy()</code>{{snd}} के लिए सुरक्षित विकल्प <code>strncat()</code> और <code>strncpy()</code><ref>Miller, Todd C. and Theo de Raadt. [http://www.usenix.org/events/usenix99/millert.html strlcpy and strlcat - consistent, safe, string copy and concatenation]. Proceedings of the 1999 USENIX Annual Technical Conference, June 6–11, 1999, pp. 175–178.</ref><ref>{{cite web|url=http://bxr.su/o/lib/libc/string/strlcat.c|title=Super User's BSD Cross Reference: /OpenBSD/lib/libc/string/strlcat.c|website=bxr.su}}</ref><ref>{{cite web|url=http://bxr.su/o/lib/libc/string/strlcpy.c|title=Super User's BSD Cross Reference: /OpenBSD/lib/libc/string/strlcpy.c|website=bxr.su}}</ref><ref>{{cite web|url=http://bxr.su/o/lib/libc/string/strncat.c|title=Super User's BSD Cross Reference: /OpenBSD/lib/libc/string/strncat.c|website=bxr.su}}</ref><ref>{{cite web|url=http://bxr.su/o/lib/libc/string/strncpy.c|title=Super User's BSD Cross Reference: /OpenBSD/lib/libc/string/strncpy.c|website=bxr.su}}</ref>
* <code>err.h</code>{{snd}} स्वरूपित त्रुटि संदेशों को प्रिंट करने के लिए कुछ फ़ंक्शन शामिल हैं<ref>{{cite web|url=http://man.freebsd.org/ग़लती होना |title=ग़लती होना|website=Man.freebsd.org |date=2012-03-29 |access-date=2013-08-25}}</ref><ref>{{cite web|url=http://bxr.su/o/include/err.h|title=Super User's BSD Cross Reference: /OpenBSD/include/err.h|website=bxr.su}}</ref>
* <code>err.h</code>{{snd}} स्वरूपित त्रुटि संदेशों को प्रिंट करने के लिए कुछ फ़ंक्शन सम्मिलित हैं<ref>{{cite web|url=http://man.freebsd.org/ग़लती होना |title=ग़लती होना|website=Man.freebsd.org |date=2012-03-29 |access-date=2013-08-25}}</ref><ref>{{cite web|url=http://bxr.su/o/include/err.h|title=Super User's BSD Cross Reference: /OpenBSD/include/err.h|website=bxr.su}}</ref>
* <code>vis.h</code>{{snd}} शामिल है <code>vis()</code> समारोह। इस फ़ंक्शन का उपयोग गैर-मुद्रण योग्य वर्णों को विज़ुअल स्वरूप में प्रदर्शित करने के लिए किया जाता है।<ref>{{cite web|title=vis(3)|url=http://www.freebsd.org/cgi/man.cgi?query=vis&sektion=3&apropos=0&manpath=FreeBSD+9.1-RELEASE|website=Man.FreeBSD.org|access-date=14 September 2013}}</ref><ref>{{cite web|url=http://bxr.su/o/lib/libc/gen/vis.c#vis|title=Super User's BSD Cross Reference: /OpenBSD/lib/libc/gen/vis.c|website=bxr.su}}</ref><ref>{{cite web|url=http://bxr.su/o/include/vis.h|title=Super User's BSD Cross Reference: /OpenBSD/include/vis.h|website=bxr.su}}</ref>
* <code>vis.h</code>{{snd}} सम्मिलित है <code>vis()</code> समारोह। इस फ़ंक्शन का उपयोग गैर-मुद्रण योग्य वर्णों को विज़ुअल स्वरूप में प्रदर्शित करने के लिए किया जाता है।<ref>{{cite web|title=vis(3)|url=http://www.freebsd.org/cgi/man.cgi?query=vis&sektion=3&apropos=0&manpath=FreeBSD+9.1-RELEASE|website=Man.FreeBSD.org|access-date=14 September 2013}}</ref><ref>{{cite web|url=http://bxr.su/o/lib/libc/gen/vis.c#vis|title=Super User's BSD Cross Reference: /OpenBSD/lib/libc/gen/vis.c|website=bxr.su}}</ref><ref>{{cite web|url=http://bxr.su/o/include/vis.h|title=Super User's BSD Cross Reference: /OpenBSD/include/vis.h|website=bxr.su}}</ref>




== अन्य भाषाओं में सी मानक पुस्तकालय ==
== अन्य भाषाओं में सी मानक पुस्तकालय ==
कुछ भाषाओं में उनके स्वयं के पुस्तकालयों में मानक सी लाइब्रेरी की कार्यक्षमता शामिल होती है। भाषा की संरचना को बेहतर ढंग से अनुकूल बनाने के लिए पुस्तकालय को अनुकूलित किया जा सकता है, लेकिन [[परिचालन शब्दार्थ]] को समान रखा जाता है। [[सी ++]] भाषा, उदाहरण के लिए, [[नाम स्थान (प्रोग्रामिंग)]] में सी मानक पुस्तकालय की कार्यक्षमता शामिल है <code>std</code> (जैसे, <code>std::printf</code>, <code>std::atoi</code>, <code>std::feof</code>), सी वाले के समान नामों वाली हेडर फाइलों में (<code>cstdio</code>, <code>cmath</code>, <code>cstdlib</code>, वगैरह।)। अन्य भाषाएँ जो समान दृष्टिकोण अपनाती हैं, वे हैं D (प्रोग्रामिंग भाषा), [[पर्ल]], [[रूबी (प्रोग्रामिंग भाषा)]] और [[पायथन (प्रोग्रामिंग भाषा)]] का मुख्य कार्यान्वयन जिसे [[CPython]] के रूप में जाना जाता है। पायथन 2 में, उदाहरण के लिए, अंतर्निहित फ़ाइल ऑब्जेक्ट्स को सी के उपयोग से लागू किया गया है <code>stdio</code> पैकेट ,<ref>{{cite web|url=https://docs.python.org/library/stdtypes.html#bltin-file-objects |title=The Python Standard Library: 6.9. File Objects |publisher=Docs.python.org |access-date=28 October 2011}}</ref> ताकि उपलब्ध ऑपरेशंस (ओपन, रीड, राइट, आदि) से संबंधित सी फ़ंक्शंस के समान व्यवहार की उम्मीद की जा सके। [[जंग (प्रोग्रामिंग भाषा)]] में एक टोकरा होता है जिसे कहते हैं {{mono|libc}} जो कई सी फ़ंक्शंस, स्ट्रक्चर्स और अन्य प्रकार की परिभाषाओं का उपयोग करने की अनुमति देता है।<ref>{{cite web|url=https://doc.rust-lang.org/nightly/libc/index.html|title=libc|work=Rust Crates|access-date=31 July 2016|archive-url=https://web.archive.org/web/20160818050524/https://doc.rust-lang.org/nightly/libc/index.html|archive-date=18 August 2016|url-status=dead}}</ref>
कुछ भाषाओं में उनके स्वयं के पुस्तकालयों में मानक सी लाइब्रेरी की कार्यक्षमता सम्मिलित होती है। भाषा की संरचना को उत्तम ढंग से अनुकूल बनाने के लिए पुस्तकालय को अनुकूलित किया जा सकता है, लेकिन [[परिचालन शब्दार्थ]] को समान रखा जाता है। [[सी ++]] भाषा, उदाहरण के लिए, [[नाम स्थान (प्रोग्रामिंग)]] में सी मानक पुस्तकालय की कार्यक्षमता सम्मिलित है <code>std</code> (जैसे, <code>std::printf</code>, <code>std::atoi</code>, <code>std::feof</code>), सी वाले के समान नामों वाली हेडर फाइलों में (<code>cstdio</code>, <code>cmath</code>, <code>cstdlib</code>, वगैरह।)। अन्य भाषाएँ जो समान दृष्टिकोण अपनाती हैं, वे हैं D (प्रोग्रामिंग भाषा), [[पर्ल]], [[रूबी (प्रोग्रामिंग भाषा)]] और [[पायथन (प्रोग्रामिंग भाषा)]] का मुख्य कार्यान्वयन जिसे [[CPython]] के रूप में जाना जाता है। पायथन 2 में, उदाहरण के लिए, अंतर्निहित फ़ाइल ऑब्जेक्ट्स को सी के उपयोग से लागू किया गया है <code>stdio</code> पैकेट ,<ref>{{cite web|url=https://docs.python.org/library/stdtypes.html#bltin-file-objects |title=The Python Standard Library: 6.9. File Objects |publisher=Docs.python.org |access-date=28 October 2011}}</ref> जिससे कि उपलब्ध ऑपरेशंस (ओपन, रीड, राइट, आदि) से संबंधित सी फ़ंक्शंस के समान व्यवहार की उम्मीद की जा सके। [[जंग (प्रोग्रामिंग भाषा)]] में एक टोकरा होता है जिसे कहते हैं {{mono|libc}} जो कई सी फ़ंक्शंस, स्ट्रक्चर्स और अन्य प्रकार की परिभाषाओं का उपयोग करने की अनुमति देता है।<ref>{{cite web|url=https://doc.rust-lang.org/nightly/libc/index.html|title=libc|work=Rust Crates|access-date=31 July 2016|archive-url=https://web.archive.org/web/20160818050524/https://doc.rust-lang.org/nightly/libc/index.html|archive-date=18 August 2016|url-status=dead}}</ref>




== अन्य भाषाओं के मानक पुस्तकालयों की तुलना ==
== अन्य भाषाओं के मानक पुस्तकालयों की तुलना ==
सी मानक पुस्तकालय कुछ अन्य भाषाओं के मानक पुस्तकालयों की तुलना में छोटा है। सी लाइब्रेरी गणितीय कार्यों, स्ट्रिंग मैनिपुलेशन, प्रकार रूपांतरण, और फ़ाइल और कंसोल-आधारित I/O का मूल सेट प्रदान करती है। इसमें C++ [[मानक टेम्पलेट लाइब्रेरी]] जैसे कंटेनर (डेटा स्ट्रक्चर) का एक मानक सेट शामिल नहीं है, पूरे [[ग्राफिकल यूज़र इंटरफ़ेस]] (GUI) टूलकिट, नेटवर्किंग टूल्स और [[जावा (सॉफ्टवेयर प्लेटफॉर्म)]] और .NET की अन्य कार्यक्षमताओं की प्रचुरता को तो छोड़ ही दें। फ्रेमवर्क मानक के रूप में प्रदान करते हैं। छोटे मानक पुस्तकालय का मुख्य लाभ यह है कि कार्यशील ISO C वातावरण प्रदान करना अन्य भाषाओं की तुलना में बहुत आसान है, और फलस्वरूप C को एक नए प्लेटफ़ॉर्म पर पोर्ट करना तुलनात्मक रूप से आसान है।
सी मानक पुस्तकालय कुछ अन्य भाषाओं के मानक पुस्तकालयों की तुलना में छोटा है। सी लाइब्रेरी गणितीय कार्यों, स्ट्रिंग मैनिपुलेशन, प्रकार रूपांतरण, और फ़ाइल और कंसोल-आधारित I/O का मूल सेट प्रदान करती है। इसमें C++ [[मानक टेम्पलेट लाइब्रेरी]] जैसे कंटेनर (डेटा स्ट्रक्चर) का एक मानक सेट सम्मिलित नहीं है, पूरे [[ग्राफिकल यूज़र इंटरफ़ेस]] (GUI) टूलकिट, नेटवर्किंग टूल्स और [[जावा (सॉफ्टवेयर प्लेटफॉर्म)]] और .NET की अन्य कार्यक्षमताओं की प्रचुरता को तो छोड़ ही दें। फ्रेमवर्क मानक के रूप में प्रदान करते हैं। छोटे मानक पुस्तकालय का मुख्य लाभ यह है कि कार्यशील ISO C वातावरण प्रदान करना अन्य भाषाओं की तुलना में बहुत आसान है, और फलस्वरूप C को एक नए प्लेटफ़ॉर्म पर पोर्ट करना तुलनात्मक रूप से आसान है।


== यह भी देखें ==
== यह भी देखें ==

Revision as of 19:24, 3 March 2023

C मानक पुस्तकालय या libc, C (प्रोग्रामिंग भाषा) के लिए मानक पुस्तकालय है, जैसा कि ISO C मानक में निर्दिष्ट है।[1] मूल एएनएसआई सी मानक से प्रारंभ होकर, इसे उसी समय सी पॉज़िक्स लाइब्रेरी के रूप में विकसित किया गया था, जो इसका एक सुपरसेट है।[2][3] चूंकि एएनएसआई सी को मानकीकरण के लिए अंतर्राष्ट्रीय संगठन द्वारा अपनाया गया था,[4] सी मानक पुस्तकालय को आईएसओ सी पुस्तकालय भी कहा जाता है।

सी मानक पुस्तकालय मैक्रो (कंप्यूटर विज्ञान) एस, डेटा प्रकार की परिभाषाएं और कार्य जैसे चरित्र स्ट्रिंग (कंप्यूटर विज्ञान) हैंडलिंग, गणितीय संगणना, इनपुट / आउटपुट प्रोसेसिंग, मेमोरी प्रबंधन, और कई अन्य ऑपरेटिंग सिस्टम सेवाएं प्रदान करता है।

एप्लिकेशन प्रोग्रामिंग इंटरफ़ेस

शीर्षलेख फ़ाइलें

सी मानक लाइब्रेरी का अप्लिकेशन प्रोग्रामिंग अंतरफलक (एपीआई) कई शीर्षलेख फ़ाइलों में घोषित किया गया है। प्रत्येक शीर्ष लेख फ़ाइल में एक या अधिक फ़ंक्शन घोषणाएँ, डेटा प्रकार परिभाषाएँ और मैक्रोज़ होते हैं।

स्थिरता की लंबी अवधि के बाद, तीन नई शीर्षलेख फ़ाइलें (iso646.h, wchar.h, और wctype.h) नॉर्मेटिव ऐडेंडम 1 (NA1) के साथ जोड़े गए थे, जो 1995 में प्रमाणित C मानक के अतिरिक्त था। छह और हेडर फाइलें (complex.h, fenv.h, inttypes.h, stdbool.h, stdint.h, और tgmath.h) को C99 के साथ जोड़ा गया, जो 1999 में प्रकाशित C मानक में संशोधन था, और पांच और फाइलें (stdalign.h, stdatomic.h, stdnoreturn.h, threads.h, और uchar.h) 2011 में C11 (C मानक संशोधन) के साथ। कुल मिलाकर, अब 29 हेडर फाइलें हैं:

Name From Description
<assert.h> Contains the assert macro, used to assist with detecting logical errors and other types of bugs in debugging versions of a program.
<complex.h> C99 A set of functions for manipulating complex numbers.
<ctype.h> Defines set of functions used to classify characters by their types or to convert between upper and lower case in a way that is independent of the used character set (typically ASCII or one of its extensions, although implementations utilizing EBCDIC are also known).
<errno.h> For testing error codes reported by library functions.
<fenv.h> C99 Defines a set of functions for controlling floating-point environment.
<float.h> Defines macro constants specifying the implementation-specific properties of the floating-point library.
<inttypes.h> C99 Defines exact-width integer types.
<iso646.h> NA1 Defines several macros that implement alternative ways to express several standard tokens. For programming in ISO 646 variant character sets.
<limits.h> Defines macro constants specifying the implementation-specific properties of the integer types.
<locale.h> Defines localization functions.
<math.h> Defines common mathematical functions.
<setjmp.h> Declares the macros setjmp and longjmp, which are used for non-local exits.
<signal.h> Defines signal-handling functions.
<stdalign.h> C11 For querying and specifying the alignment of objects.
<stdarg.h> For accessing a varying number of arguments passed to functions.
<stdatomic.h> C11 For atomic operations on data shared between threads.
<stdbool.h> C99 Defines a boolean data type.
<stddef.h> Defines several useful types and macros.
<stdint.h> C99 Defines exact-width integer types.
<stdio.h> Defines core input and output functions
<stdlib.h> Defines numeric conversion functions, pseudo-random numbers generation functions, memory allocation, process control functions
<stdnoreturn.h> C11 For specifying non-returning functions
<string.h> Defines string-handling functions
<tgmath.h> C99 Defines type-generic mathematical functions.
<threads.h> C11 Defines functions for managing multiple threads, mutexes and condition variables
<time.h> Defines date- and time-handling functions
<uchar.h> C11 Types and functions for manipulating Unicode characters
<wchar.h> NA1 Defines wide-string-handling functions
<wctype.h> NA1 Defines set of functions used to classify wide characters by their types or to convert between upper and lower case

शीर्षलेख फ़ाइलों में से तीन (complex.h, stdatomic.h, और threads.h) सशर्त विशेषताएं हैं जिनका समर्थन करने के लिए कार्यान्वयन की आवश्यकता नहीं है।

POSIX मानक ने यूनिक्स-विशिष्ट कार्यक्षमता के लिए कई गैर-मानक C हेडर जोड़े। कई ने अन्य आर्किटेक्चर के लिए अपना रास्ता खोज लिया है। उदाहरणों में सम्मिलित fcntl.h और unistd.h. कई अन्य समूह अन्य गैर-मानक शीर्षलेखों का उपयोग कर रहे हैं - जीएनयू सी लाइब्रेरी में है alloca.h, और HP OpenVMS के पास है va_count() समारोह।

दस्तावेज़

यूनिक्स जैसी प्रणालियों पर, वास्तव में कार्यान्वित एपीआई का आधिकारिक दस्तावेज मैन पेज के रूप में प्रदान किया जाता है। अधिकांश प्रणालियों पर, मानक लाइब्रेरी कार्यों पर मैन पेज अनुभाग 3 में होते हैं; अनुभाग 7 में अंतर्निहित अवधारणाओं पर कुछ और सामान्य पृष्ठ हो सकते हैं (उदा. man 7 math_error लिनक्स में)।

कार्यान्वयन

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

Microsoft Windows पर, कोर सिस्टम डायनेमिक लाइब्रेरी (डायनेमिक-लिंक लाइब्रेरी) Microsoft Visual C++ कंपाइलर v6.0 के लिए C मानक लाइब्रेरी का कार्यान्वयन प्रदान करती है; Microsoft Visual C++ कंपाइलर के नए संस्करणों के लिए C मानक लाइब्रेरी प्रत्येक कंपाइलर द्वारा व्यक्तिगत रूप से, साथ ही पुनर्वितरण योग्य पैकेज द्वारा प्रदान की जाती है। C में लिखे गए संकलित अनुप्रयोग या तो स्थिर रूप से C लाइब्रेरी से जुड़े होते हैं, साझा पुस्तकालय के एक गतिशील संस्करण से जुड़े होते हैं, जो लक्षित सिस्टम पर उपस्तिथ होने के अतिरिक्त इन अनुप्रयोगों के साथ भेजे जाते हैं। कंपाइलर की C लाइब्रेरी में फ़ंक्शंस को Microsoft Windows के इंटरफ़ेस के रूप में नहीं माना जाता है।

कई अन्य कार्यान्वयन उपस्तिथ हैं, जो विभिन्न ऑपरेटिंग सिस्टम और सी कंपाइलर दोनों के साथ उपलब्ध हैं। कुछ लोकप्रिय कार्यान्वयन निम्नलिखित हैं:

कंपाइलर बिल्ट-इन फ़ंक्शंस

कुछ संकलक (उदाहरण के लिए, GNU संकलक संग्रह[7]) सी मानक पुस्तकालय में कई कार्यों के अंतर्निर्मित संस्करण प्रदान करें; अर्थात्, कार्यों के कार्यान्वयन को संकलित वस्तु फ़ाइल में लिखा गया है, और प्रोग्राम सी लाइब्रेरी साझा ऑब्जेक्ट फ़ाइल में फ़ंक्शंस के अतिरिक्त अंतर्निहित संस्करणों को कॉल करता है। यह फ़ंक्शन-कॉल ओवरहेड को कम करता है, खासकर यदि फ़ंक्शन कॉल को इनलाइन फ़ंक्शन वेरिएंट के साथ बदल दिया जाता है, और संकलक अनुकूलन के अन्य रूपों की अनुमति देता है (जैसा कि कंपाइलर बहाव को काबू करें जानता है। बिल्ट-इन वेरिएंट की कंट्रोल-फ्लो विशेषताओं), लेकिन भ्रम उत्पन्न कर सकता है जब डिबगिंग (उदाहरण के लिए, अंतर्निहित संस्करणों को इंस्ट्रूमेंटेशन (कंप्यूटर प्रोग्रामिंग) वेरिएंट से बदला नहीं जा सकता)।

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

लिंकिंग, libm

फ्रीबीएसडी के अनुसार [8] और ग्लिबैक,[9] कुछ फ़ंक्शन जैसे पाप () डिफ़ॉल्ट रूप से लिंक नहीं होते हैं और इसके अतिरिक्त गणितीय पुस्तकालय libm में बंडल किए जाते हैं। यदि उनमें से किसी का उपयोग किया जाता है, तो लिंकर को निर्देश दिया जाना चाहिए -lm. POSIX के लिए आवश्यक है कि c99 कंपाइलर समर्थन करे -lm, और यह कि हेडर में घोषित किए गए कार्य math.h, complex.h, और fenv.h लिंक करने के लिए उपलब्ध हैं यदि -lm निर्दिष्ट है, लेकिन यह निर्दिष्ट नहीं करता है कि फ़ंक्शन डिफ़ॉल्ट रूप से लिंक किए गए हैं या नहीं।[10] musl सब कुछ एक ही libc लाइब्रेरी में डालकर और एक खाली libm प्रदान करके इस आवश्यकता को पूरा करता है।[11]


पता लगाना

सी मानक के अनुसार मैक्रो __STDC_HOSTED__ कार्यान्वयन की मेजबानी होने पर 1 को परिभाषित किया जाएगा। एक होस्टेड कार्यान्वयन में सी मानक द्वारा निर्दिष्ट सभी शीर्षलेख हैं। कार्यान्वयन फ्रीस्टैंडिंग भी हो सकता है, जिसका अर्थ है कि ये हेडर उपस्तिथ नहीं होंगे। यदि कार्यान्वयन 'फ्रीस्टैंडिंग' है, तो यह परिभाषित करेगा __STDC_HOSTED__ से 0.

समस्याएं और समाधान

बफ़र अधिकता भेद्यता

सी मानक पुस्तकालय में कुछ कार्य बफर अतिप्रवाह कमजोरियों के लिए कुख्यात रहे हैं और सामान्यतः बग्गी प्रोग्रामिंग को उनके गोद लेने के बाद से प्रोत्साहित करते हैं।[lower-alpha 1] सबसे अधिक आलोचना वाली वस्तुएँ हैं:

  • सी स्ट्रिंग हैंडलिंग | स्ट्रिंग-मैनिपुलेशन रूटीन, सहित strcpy() और strcat(), सीमा जाँच की कमी और संभावित बफर ओवरफ़्लो के लिए यदि सीमाएँ मैन्युअल रूप से जाँची नहीं जाती हैं;
  • साइड इफेक्ट (कंप्यूटर विज्ञान) के लिए सामान्य रूप से स्ट्रिंग रूटीन | साइड-इफेक्ट्स, गैर-जिम्मेदार बफर उपयोग को प्रोत्साहित करना, हमेशा वैध अशक्त-समाप्त स्ट्रिंग की गारंटी नहीं देना।[lower-alpha 2]
  • printf() रूटीन का परिवार, कॉल स्टैक को खराब करने के लिए जब प्रारूप स्ट्रिंग दिए गए तर्कों से मेल नहीं खाती। इस मौलिक दोष ने हमलों की एक पूरी श्रेणी बनाई: प्रारूप स्ट्रिंग हमले;
  • gets() और scanf() I/O रूटीन का परिवार, (या तो कोई या आसान) इनपुट लंबाई जाँच की कमी के लिए।

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

आईएसओ सी समिति ने तकनीकी रिपोर्ट टीआर 24731-1 प्रकाशित की[12] और टीआर 24731-2 पर काम कर रहा है[13] सीमा जाँच और स्वत: बफर आवंटन के साथ कुछ कार्यों को अपनाने का प्रस्ताव करना। पूर्व को कुछ प्रशंसा के साथ कड़ी आलोचना का सामना करना पड़ा,[14][15] बाद वाले को मिश्रित प्रतिक्रियाएँ मिलीं। इसके बावजूद, टीआर 24731-1 को माइक्रोसॉफ्ट के सी मानक पुस्तकालय में लागू किया गया है और इसके संकलक पुराने असुरक्षित कार्यों का उपयोग करते समय चेतावनियां जारी करते हैं।

=== थ्रेडिंग की समस्याएं, दौड़ की स्थितियों के लिए भेद्यता === strerror() ई> रूटीन की थ्रेड सुरक्षा और अन्यथा दौड़ स्थितियों के प्रति संवेदनशील होने के लिए आलोचना की जाती है।

त्रुटि प्रबंधन

सी मानक पुस्तकालय में कार्यों की त्रुटि प्रबंधन संगत नहीं है और कभी-कभी भ्रमित होती है। लिनक्स मैनुअल पेज के मुताबिक math_error, ग्लिबैक के अनुसार वर्तमान (संस्करण 2.8) स्थिति गड़बड़ है। अधिकांश (लेकिन सभी नहीं) फ़ंक्शन त्रुटियों पर अपवाद उठाते हैं। कुछ ने इरनो भी सेट किया। कुछ फ़ंक्शन इरनो सेट करते हैं, लेकिन अपवाद नहीं बढ़ाते हैं। बहुत कम कार्य न तो करते हैं।[16]


मानकीकरण

COBOL और फोरट्रान जैसी पारंपरिक भाषाओं के विपरीत, मूल C (प्रोग्रामिंग भाषा) ने I/O संचालन जैसे कोई अंतर्निहित कार्य प्रदान नहीं किए।[citation needed] समय के साथ, सी के उपयोगकर्ता समुदायों ने विचारों और कार्यान्वयन को साझा किया जिसे अब सी मानक पुस्तकालय कहा जाता है। इनमें से कई विचारों को अंततः मानकीकृत सी भाषा की परिभाषा में सम्मिलित किया गया।

यूनिक्स और सी दोनों को 1960 के दशक के अंत और 1970 के दशक के प्रारंभ में बेल लैब्स | एटी एंड टी की बेल प्रयोगशालाओं में बनाया गया था। 1970 के दशक के समय सी भाषा तेजी से लोकप्रिय हुई। कई विश्वविद्यालयों और संगठनों ने अपनी स्वयं की परियोजनाओं के लिए भाषा के अपने संस्करण बनाने प्रारंभ कर दिए। 1980 के दशक की शुरुआत तक विभिन्न सी कार्यान्वयनों के बीच संगतता समस्याएं स्पष्ट हो गईं। 1983 में अमेरिकी राष्ट्रीय मानक संस्थान (एएनएसआई) ने एएनएसआई सी नामक सी के मानक विनिर्देश स्थापित करने के लिए एक समिति का गठन किया। यह कार्य 1989 में तथाकथित C89 मानक के निर्माण में समाप्त हुआ। परिणामी मानक का एक हिस्सा सॉफ्टवेयर पुस्तकालयों का एक सेट था जिसे ANSI C मानक पुस्तकालय कहा जाता है।

POSIX मानक पुस्तकालय

POSIX, साथ ही एकल यूनिक्स विशिष्टता, कई रूटीनों को निर्दिष्ट करती है जो मूल C मानक लाइब्रेरी में उपलब्ध होने चाहिए। POSIX विनिर्देशन में अन्य उपयोगों के साथ-साथ POSIX थ्रेड्स|मल्टी-थ्रेडिंग, बर्कले सॉकेट्स और नियमित अभिव्यक्ति के लिए हेडर फाइलें सम्मिलित हैं। इन्हें अधिकांशतः सी मानक लाइब्रेरी कार्यक्षमता के साथ निकटता की अलग-अलग डिग्री के साथ कार्यान्वित किया जाता है। उदाहरण के लिए, ग्लिबैक जैसे कार्यों को लागू करता है fork अंदर libc.so, लेकिन एनपीटीएल को ग्लिबैक में मिलाने से पहले इसने अपने स्वयं के लिंकर फ़्लैग तर्क के साथ एक अलग पुस्तकालय का गठन किया। अधिकांशतः, इस POSIX-निर्दिष्ट कार्यक्षमता को लाइब्रेरी के भाग के रूप में माना जाएगा; मूल सी पुस्तकालय को एएनएसआई या मानकीकरण सी पुस्तकालय के लिए अंतर्राष्ट्रीय संगठन के रूप में पहचाना जा सकता है।

बीएसडी libc

BSD libc POSIX मानक पुस्तकालय का एक सुपरसेट है, जो BSD ऑपरेटिंग सिस्टम जैसे FreeBSD, NetBSD, OpenBSD और macOS के साथ सम्मिलित C पुस्तकालयों द्वारा समर्थित है। बीएसडी लिबक में कुछ एक्सटेंशन हैं जो मूल मानक में परिभाषित नहीं हैं, जिनमें से कई पहली बार 1994 के बीएसडी#4.4बीएसडी और डिसेंडेंट्स|4.4बीएसडी रिलीज में दिखाई दिए (1989 में जारी किए गए पहले मानक के बाद बड़े पैमाने पर विकसित किए गए पहले)। BSD libc के कुछ विस्तार हैं:

  • sys/tree.h – लाल-काले ट्री और पेड़ का पेड़ का कार्यान्‍वयन सम्मिलित है[17][18]
  • sys/queue.h – लिंक्ड सूची, कतार (डेटा संरचना), पूंछ कतार, आदि का कार्यान्वयन।[19][20]
  • fgetln() – में परिभाषित stdio.h. इसका उपयोग फ़ाइल लाइन को लाइन से पढ़ने के लिए किया जा सकता है।[21][22][23]
  • fts.h – फ़ाइल पदानुक्रम को पार करने के लिए कुछ फ़ंक्शन सम्मिलित हैं[24][25]
  • db.h – बर्कले डीबी से जुड़ने के लिए कुछ कार्य[26][27]
  • strlcat() और strlcpy() – के लिए सुरक्षित विकल्प strncat() और strncpy()[28][29][30][31][32]
  • err.h – स्वरूपित त्रुटि संदेशों को प्रिंट करने के लिए कुछ फ़ंक्शन सम्मिलित हैं[33][34]
  • vis.h – सम्मिलित है vis() समारोह। इस फ़ंक्शन का उपयोग गैर-मुद्रण योग्य वर्णों को विज़ुअल स्वरूप में प्रदर्शित करने के लिए किया जाता है।[35][36][37]


अन्य भाषाओं में सी मानक पुस्तकालय

कुछ भाषाओं में उनके स्वयं के पुस्तकालयों में मानक सी लाइब्रेरी की कार्यक्षमता सम्मिलित होती है। भाषा की संरचना को उत्तम ढंग से अनुकूल बनाने के लिए पुस्तकालय को अनुकूलित किया जा सकता है, लेकिन परिचालन शब्दार्थ को समान रखा जाता है। सी ++ भाषा, उदाहरण के लिए, नाम स्थान (प्रोग्रामिंग) में सी मानक पुस्तकालय की कार्यक्षमता सम्मिलित है std (जैसे, std::printf, std::atoi, std::feof), सी वाले के समान नामों वाली हेडर फाइलों में (cstdio, cmath, cstdlib, वगैरह।)। अन्य भाषाएँ जो समान दृष्टिकोण अपनाती हैं, वे हैं D (प्रोग्रामिंग भाषा), पर्ल, रूबी (प्रोग्रामिंग भाषा) और पायथन (प्रोग्रामिंग भाषा) का मुख्य कार्यान्वयन जिसे CPython के रूप में जाना जाता है। पायथन 2 में, उदाहरण के लिए, अंतर्निहित फ़ाइल ऑब्जेक्ट्स को सी के उपयोग से लागू किया गया है stdio पैकेट ,[38] जिससे कि उपलब्ध ऑपरेशंस (ओपन, रीड, राइट, आदि) से संबंधित सी फ़ंक्शंस के समान व्यवहार की उम्मीद की जा सके। जंग (प्रोग्रामिंग भाषा) में एक टोकरा होता है जिसे कहते हैं libc जो कई सी फ़ंक्शंस, स्ट्रक्चर्स और अन्य प्रकार की परिभाषाओं का उपयोग करने की अनुमति देता है।[39]


अन्य भाषाओं के मानक पुस्तकालयों की तुलना

सी मानक पुस्तकालय कुछ अन्य भाषाओं के मानक पुस्तकालयों की तुलना में छोटा है। सी लाइब्रेरी गणितीय कार्यों, स्ट्रिंग मैनिपुलेशन, प्रकार रूपांतरण, और फ़ाइल और कंसोल-आधारित I/O का मूल सेट प्रदान करती है। इसमें C++ मानक टेम्पलेट लाइब्रेरी जैसे कंटेनर (डेटा स्ट्रक्चर) का एक मानक सेट सम्मिलित नहीं है, पूरे ग्राफिकल यूज़र इंटरफ़ेस (GUI) टूलकिट, नेटवर्किंग टूल्स और जावा (सॉफ्टवेयर प्लेटफॉर्म) और .NET की अन्य कार्यक्षमताओं की प्रचुरता को तो छोड़ ही दें। फ्रेमवर्क मानक के रूप में प्रदान करते हैं। छोटे मानक पुस्तकालय का मुख्य लाभ यह है कि कार्यशील ISO C वातावरण प्रदान करना अन्य भाषाओं की तुलना में बहुत आसान है, और फलस्वरूप C को एक नए प्लेटफ़ॉर्म पर पोर्ट करना तुलनात्मक रूप से आसान है।

यह भी देखें

टिप्पणियाँ

  1. Morris worm that takes advantage of the well-known vulnerability in gets() have been created as early as in 1988.
  2. in C standard library, string length calculation and looking for a string's end have linear time complexities and are inefficient when used on the same or related strings repeatedly


संदर्भ

  1. ISO/IEC (2018). ISO/IEC 9899:2018(E): Programming Languages - C §7
  2. "The GNU C Library – Introduction". gnu.org. Retrieved 2013-12-05.
  3. "Difference between C standard library and C POSIX library". stackoverflow.com. 2012. Retrieved 2015-03-04.
  4. "C Standards". C: C Standards (in English). Keil. Retrieved 24 November 2011.{{cite web}}: CS1 maint: url-status (link)
  5. "Re: Does Newlib support mmu-less CPUs?". Cygwin.com. 23 March 2006. Archived from the original on 22 November 2008. Retrieved 28 October 2011.
  6. "musl libc". Etalabs.net. Retrieved 28 October 2011.
  7. Other built-in functions provided by GCC, GCC Manual
  8. "Compiling with cc". Retrieved 2013-03-02.
  9. Weimer, Florian. "c - What functions is the libm intended for?". Stack Overflow. Retrieved 24 February 2021.
  10. "c99 - compile standard C programs". The Open Group Base Specifications Issue 7, 2018 edition. The Open Group. Retrieved 24 February 2021.
  11. "musl FAQ". www.musl-libc.org. Retrieved 24 February 2021.
  12. "ISO/IEC TR 24731-1: Extensions to the C Library, Part I: Bounds-checking interfaces" (PDF). open-std.org. 2007-03-28. Retrieved 2014-03-13.
  13. "ISO/IEC WDTR 24731-2: Extensions to the C Library, Part II: Dynamic Allocation Functions" (PDF). open-std.org. 2008-08-10. Retrieved 2014-03-13.
  14. Do you use the TR 24731 'safe' functions in your C code? - Stack overflow
  15. "Austin Group Review of ISO/IEC WDTR 24731". Retrieved 28 October 2011.
  16. "math_error - detecting errors from mathematical functions". man7.org. 2008-08-11. Retrieved 2014-03-13.
  17. "tree". Man.freebsd.org. 2007-12-27. Retrieved 2013-08-25.
  18. "Super User's BSD Cross Reference: /OpenBSD/sys/sys/tree.h". bxr.su.
  19. "queue". Man.freebsd.org. 2011-05-13. Retrieved 2013-08-25.
  20. "Super User's BSD Cross Reference: /OpenBSD/sys/sys/queue.h". bxr.su.
  21. "fgetln". Man.freebsd.org. 1994-04-19. Retrieved 2013-08-25.
  22. "Super User's BSD Cross Reference: /OpenBSD/lib/libc/stdio/fgetln.c". bxr.su.
  23. "Super User's BSD Cross Reference: /OpenBSD/include/stdio.h". bxr.su.
  24. "फीट". Man.freebsd.org. 2012-03-18. Retrieved 2013-08-25.
  25. "Super User's BSD Cross Reference: /OpenBSD/include/fts.h". bxr.su.
  26. "डाटाबेस". Man.freebsd.org. 2010-09-10. Retrieved 2013-08-25.
  27. "Super User's BSD Cross Reference: /OpenBSD/include/db.h". bxr.su.
  28. Miller, Todd C. and Theo de Raadt. strlcpy and strlcat - consistent, safe, string copy and concatenation. Proceedings of the 1999 USENIX Annual Technical Conference, June 6–11, 1999, pp. 175–178.
  29. "Super User's BSD Cross Reference: /OpenBSD/lib/libc/string/strlcat.c". bxr.su.
  30. "Super User's BSD Cross Reference: /OpenBSD/lib/libc/string/strlcpy.c". bxr.su.
  31. "Super User's BSD Cross Reference: /OpenBSD/lib/libc/string/strncat.c". bxr.su.
  32. "Super User's BSD Cross Reference: /OpenBSD/lib/libc/string/strncpy.c". bxr.su.
  33. होना "ग़लती होना". Man.freebsd.org. 2012-03-29. Retrieved 2013-08-25. {{cite web}}: Check |url= value (help)
  34. "Super User's BSD Cross Reference: /OpenBSD/include/err.h". bxr.su.
  35. "vis(3)". Man.FreeBSD.org. Retrieved 14 September 2013.
  36. "Super User's BSD Cross Reference: /OpenBSD/lib/libc/gen/vis.c". bxr.su.
  37. "Super User's BSD Cross Reference: /OpenBSD/include/vis.h". bxr.su.
  38. "The Python Standard Library: 6.9. File Objects". Docs.python.org. Retrieved 28 October 2011.
  39. "libc". Rust Crates. Archived from the original on 18 August 2016. Retrieved 31 July 2016.


अग्रिम पठन


बाहरी संबंध