2009-11-10 6 views
7

GNU सी पुस्तकालय के स्रोत कोड पर glancing, मैंने पाया inet_ntoa,क्यों inet_ntoa एक गैर-पुनर्वित्त समारोह होने के लिए डिज़ाइन किया गया है?

static __thread char buffer[18] 

मेरा प्रश्न है साथ implementated है के बाद से reeentrant inet_ntoa, क्यों GNU सी लाइब्रेरी उपयोग की लेखक नहीं है का उपयोग करने के की जरूरत है इसे लागू करने के लिए malloc?

धन्यवाद।

उत्तर

17

कारण यह ढेर का उपयोग नहीं कर रहा है मानकों (पीओएसईक्स) और अन्य प्रणालियों के अनुरूप है। इंटरफ़ेस ऐसा नहीं है कि आपको बफर वापस लौटाया जाना चाहिए। यह स्थैतिक भंडारण मानता है ..

लेकिन इसे थ्रेड लोकल (__thread के साथ) घोषित करके, दो धागे एक दूसरे के साथ संघर्ष नहीं करते हैं यदि वे दोनों फ़ंक्शन को कॉल करते हैं। यह इंटरफ़ेस की टूटी हुईता के लिए ग्लिब का वर्कअराउंड है।

यह सच है कि यह पुन: प्रवेश नहीं है या उस अवधि की भावना के अनुरूप है। यदि आपके पास एक रिकर्सिव फ़ंक्शन है जो इसे कॉल करता है, तो आप कॉल के बीच बफर पर भरोसा नहीं कर सकते हैं। लेकिन इसका उपयोग कई धागे द्वारा किया जा सकता है, जो अक्सर पर्याप्त होता है।

संपादित करें: वैसे, मुझे बस याद आया, इस फ़ंक्शन का एक नया संस्करण है जो कॉलर-प्रदत्त बफर का उपयोग करता है। inet_ntop() देखें।

+0

@asveikau: प्रिंट त्रुटि के लिए खेद है। – Jichao

+0

@asveikau: निष्कर्ष में, इसकी संगतता के लिए? – Jichao

+0

@jcyang हां, यह संगतता के लिए है। – asveikau

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