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

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

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

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

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

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

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

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

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

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

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


 * बीएसडी लिबक, बर्कले सॉफ्टवेयर वितरण-व्युत्पन्न ऑपरेटिंग सिस्टम के साथ वितरित विभिन्न कार्यान्वयन।
 * जीएनयू सी लाइब्रेरी (gलिबक), जीएनयू हर्ड, जीएनयू/केफ्रीबीएसडी और लिनक्स में प्रयुक्त।
 * विंडोज लाइब्रेरी फ़ाइलें सीआरटी माइक्रोसॉफ़्ट सी रन-टाइम लाइब्रेरी, माइक्रोसॉफ़्ट Visual C++ का भाग।
 * डायटलिबक, सी मानक लाइब्रेरी का वैकल्पिक छोटा कार्यान्वयन (एमएमयू-कम)।
 * uCलिबक, एम्बेडेड μCलिनक्स सिस्टम के लिए सी मानक लाइब्रेरी (एमएमयू-कम)।


 * ucलिबक-ng, एम्बेडेड सी लाइब्रेरी, μCलिबक का फोर्क, स्मृति प्रबंधन इकाई (एमएमयू) समर्थन के साथ अभी भी अनुरक्षित है।
 * न्यूलिब, एम्बेडेड सिस्टम के लिए सी मानक लाइब्रेरी (एमएमयू-कम) और विंडोज के लिए Cygwin जीएनयू वितरण में उपयोग किया जाता है।


 * kलिबक, मुख्य रूप से लिनक्स सिस्टम को बूट करने के लिए।
 * musl, लिनक्स सिस्टम के लिए और हल्का सी मानक लाइब्रेरी कार्यान्वयन।
 * बायोनिक (सॉफ्टवेयर), मूल रूप से गूगल द्वारा एंड्रॉयड एम्बेडेड सिस्टम ऑपरेटिंग सिस्टम के लिए विकसित किया गया है, जो बीएसडी लिबक से प्राप्त हुआ है।
 * picoलिबक, कीथ पैकर्ड द्वारा विकसित, न्यूलिब और एवीआर लिबक के कोड के आधार पर सीमित रैम के साथ छोटे एम्बेडेड सिस्टम को लक्षित करता है।

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

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

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

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

बफ़र अधिकता भेद्यता
सी मानक लाइब्रेरी में कुछ कार्य बफर अतिप्रवाह कमजोरियों के लिए कुख्यात रहे हैं और सामान्यतः बग्गी प्रोग्रामिंग को उनके गोद लेने के पश्चात् से प्रोत्साहित करते हैं। अतः यह सबसे अधिक आलोचना वाली वस्तुएँ हैं।


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

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

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

थ्रेडिंग समस्याएं, दौड़ की स्थिति के लिए भेद्यता

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

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

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

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

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

बीएसडी लिबक
बीएसडी लिबक पॉज़िक्स मानक लाइब्रेरी का उत्तम समूह है। जो बीएसडी ऑपरेटिंग सिस्टम जैसे Freeबीएसडी, Netबीएसडी, Openबीएसडी और macOS के साथ सम्मिलित सी लाइब्रेरीों द्वारा समर्थित है। बीएसडी लिबक में कुछ एक्सटेंशन हैं जो मूल मानक में परिभाषित नहीं हैं। जिनमें से अनेक प्रथम बार सन् 1994 के 4.4 बीएसडी रिलीज में दिखाई दिए (सन् 1989 में जारी किए गए प्रथम मानक के पश्चात् बड़े पैमाने पर विकसित किए गए)। बीएसडी लिबक के कुछ विस्तार हैं।


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

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

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

यह भी देखें

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

बाहरी संबंध

 * The C Library Reference Guide
 * Handy list of which headers are in which standard
 * माइक्रोसॉफ़्ट Universal C runtime routines by category on MSDN
 * Netबीएसडी C libraries manual and full C library source
 * Manual pages for the original C standard libraries in Unix