सी मानक लाइब्रेरी

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

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

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

स्थिरता की लंबी अवधि के बाद, तीन नई शीर्षलेख फ़ाइलें (, , और  ) नॉर्मेटिव ऐडेंडम 1 (NA1) के साथ जोड़े गए थे, जो 1995 में प्रमाणित C मानक के अतिरिक्त था। छह और हेडर फाइलें ( ,  ,  ,  ,  , और  ) को C99 के साथ जोड़ा गया, जो 1999 में प्रकाशित C मानक में संशोधन था, और पांच और फाइलें ( ,  ,  ,  , और  ) 2011 में C11 (C मानक संशोधन) के साथ। कुल मिलाकर, अब 29 हेडर फाइलें हैं:

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

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

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

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

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

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


 * बीएसडी लिबक, बर्कले सॉफ्टवेयर वितरण-व्युत्पन्न ऑपरेटिंग सिस्टम के साथ वितरित विभिन्न कार्यान्वयन
 * GNU C लाइब्रेरी (glibc), GNU हर्ड, GNU/kFreeBSD और Linux में प्रयुक्त
 * Windows लाइब्रेरी फ़ाइलें#CRT|Microsoft C रन-टाइम लाइब्रेरी, Microsoft Visual C++ का हिस्सा
 * diyas, सी मानक पुस्तकालय का एक वैकल्पिक छोटा कार्यान्वयन (एमएमयू-कम)
 * uClibc|μClibc, एम्बेडेड μClinux सिस्टम के लिए एक C मानक पुस्तकालय (MMU-कम)
 * uClibc|uclibc-ng, एक एम्बेडेड C लाइब्रेरी, μClibc का फोर्क, स्मृति प्रबंधन इकाई (MMU) समर्थन के साथ अभी भी अनुरक्षित है
 * न्यूलिब, एम्बेडेड सिस्टम के लिए एक सी मानक पुस्तकालय (एमएमयू-कम) और Windows के लिए Cygwin GNU वितरण में उपयोग किया जाता है
 * klibc, मुख्य रूप से Linux सिस्टम को बूट करने के लिए
 * musl, लिनक्स सिस्टम के लिए एक और हल्का सी मानक पुस्तकालय कार्यान्वयन
 * बायोनिक (सॉफ्टवेयर), मूल रूप से Google द्वारा Android एम्बेडेड सिस्टम ऑपरेटिंग सिस्टम के लिए विकसित किया गया है, जो BSD libc से प्राप्त हुआ है
 * picolibc, कीथ पैकर्ड द्वारा विकसित, न्यूलिब और AVR Libc के कोड के आधार पर सीमित रैम के साथ छोटे एम्बेडेड सिस्टम को लक्षित करता है।

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

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

लिंकिंग, libm
फ्रीबीएसडी के तहत और ग्लिबैक, कुछ फ़ंक्शन जैसे पाप डिफ़ॉल्ट रूप से लिंक नहीं होते हैं और इसके बजाय गणितीय पुस्तकालय libm में बंडल किए जाते हैं। यदि उनमें से किसी का उपयोग किया जाता है, तो लिंकर को निर्देश दिया जाना चाहिए. POSIX के लिए आवश्यक है कि c99 कंपाइलर समर्थन करे, और यह कि हेडर में घोषित किए गए कार्य  ,  , और   लिंक करने के लिए उपलब्ध हैं अगर   निर्दिष्ट है, लेकिन यह निर्दिष्ट नहीं करता है कि फ़ंक्शन डिफ़ॉल्ट रूप से लिंक किए गए हैं या नहीं। musl सब कुछ एक ही libc लाइब्रेरी में डालकर और एक खाली libm प्रदान करके इस आवश्यकता को पूरा करता है।

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

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

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

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

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

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

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

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

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

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


 * – लाल-काले ट्री और पेड़ का पेड़ का कार्यान्‍वयन शामिल है
 * – लिंक्ड सूची, कतार (डेटा संरचना), पूंछ कतार, आदि का कार्यान्वयन।
 * – में परिभाषित  . इसका उपयोग फ़ाइल लाइन को लाइन से पढ़ने के लिए किया जा सकता है।
 * – फ़ाइल पदानुक्रम को पार करने के लिए कुछ फ़ंक्शन शामिल हैं
 * – बर्कले डीबी से जुड़ने के लिए कुछ कार्य
 * और  –  के लिए सुरक्षित विकल्प   और
 * – स्वरूपित त्रुटि संदेशों को प्रिंट करने के लिए कुछ फ़ंक्शन शामिल हैं
 * – शामिल है   समारोह। इस फ़ंक्शन का उपयोग गैर-मुद्रण योग्य वर्णों को विज़ुअल स्वरूप में प्रदर्शित करने के लिए किया जाता है।

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

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

यह भी देखें

 * सी ++ मानक पुस्तकालय

बाहरी संबंध

 * The C Library Reference Guide
 * Handy list of which headers are in which standard
 * Microsoft Universal C runtime routines by category on MSDN
 * NetBSD C libraries manual and full C library source
 * Manual pages for the original C standard libraries in Unix