2013-02-14 47 views
9

यहां स्रोत है जो मैं ब्राउज़ कर रहा था: glibc source। मेरा विशेष प्रश्न इस विशेष कार्य के सेट से उत्पन्न होता है: socket libraryजब मैं सॉकेट कोड में आया तो मैं ग्लिब को देख रहा था, क्या कोई यह बता सकता है कि क्या हो रहा है?

उदाहरण के लिए

(कार्यों का सबसे इस तरह से स्थापित कर रहे हैं) socket/bind.c के स्रोत है:

19 #include <errno.h> 
    20 #include <sys/socket.h> 
    21 
    22 /* Give the socket FD the local address ADDR (which is LEN bytes long). */ 
    23 int 
    24 __bind (fd, addr, len) 
    25  int fd; 
    26  __CONST_SOCKADDR_ARG addr; 
    27  socklen_t len; 
    28 { 
    29 __set_errno (ENOSYS); 
    30 return -1; 
    31 } 
    32 
    33 weak_alias (__bind, bind) 
    34 
    35 stub_warning (bind) 
    36 #include <stub-tag.h> 

मैं मानता हूं मैं बहुत समय खर्च नहीं किया था, लेकिन जहां बिल्कुल के लिए कोड है वास्तविक कार्य और क्या चल रहा है? क्या यह एक अच्छी तरह से इस्तेमाल किया प्रतिमान है?

उत्तर

9

__bind फ़ंक्शन stub है: यह एक ऐसा फ़ंक्शन है जो वास्तविक चीज़ (समान प्रोटोटाइप) की तरह बाहरी रूप से दिखता है लेकिन आवश्यक कार्य नहीं करता है।

weak_alias मैक्रो लिंकर को बताता है कि bind__bind के लिए एक कमजोर उपनाम होना है। यही है, bind की यह परिभाषा weak symbol है। यदि bind नामक प्रतीक की कोई अन्य परिभाषा नहीं है, तो यह परिभाषा खड़ी है; यदि bind की दूसरी (गैर-कमजोर) परिभाषा है तो गैर-कमजोर परिभाषा खड़ी है और कमजोर परिभाषा को अनदेखा किया जाता है। एक कमजोर ऊर्फ एक कमजोर प्रतीक है जो एक और प्रतीक का उपनाम है (जैसा कि अपने स्वयं के अधिकार में परिभाषा का विरोध करता है)। stub_warning मैक्रो लिंकर को एक चेतावनी उत्सर्जित करने का कारण बनता है यदि उस कमजोर उपनाम का उपयोग किया जाता है।

bind का वास्तविक कार्यान्वयन ऑपरेटिंग सिस्टम पर निर्भर करता है जो ग्लिब के लिए संकलित है। Hurd पर, इसे sysdeps/mach/hurd/bind.c में परिभाषित किया गया है। लिनक्स पर, bind एक सिस्टम कॉल है: ग्लिबल स्रोत, केवल असेंबली कोड में इसके लिए कोई सी कोड नहीं है। bindsysdeps/unix/sysv/linux/bind.S में प्रदान किया गया है जो socket की या ports/sysdeps/unix/sysv/linux/*/socket.S में आर्किटेक्चर-निर्भर परिभाषा का पुन: उपयोग करता है। उन परिभाषाएं अंतर्निहित सिस्टम कॉल के चारों ओर सभी पतली रैपर हैं, तर्क और प्रतिलिपि मूल्यों को उचित रजिस्टरों में कॉपी करने की देखभाल करते हैं।

8

आप सामान्य बाइंड() कार्यान्वयन को देख रहे हैं जो ... आपको बताता है कि बाइंड() कार्यान्वित नहीं है (यह सिर्फ एक त्रुटि देता है और ENOSYS - syscall लागू नहीं किया जाता है।)।

कई प्लेटफॉर्म आश्रित सिस्टम इस तरह ग्लिबैक काम में कॉल करते हैं - एक डिफ़ॉल्ट कार्यान्वयन है जो केवल एक त्रुटि देता है, और प्रत्येक प्लेटफ़ॉर्म/आर्किटेक्टर को मौजूद होने पर सिस्टम कॉल का कार्यान्वयन करना होता है।

उदा। लिनक्स x86 कार्यान्वयन के लिए ./sysdeps/unix/sysv/linux/i386/socket.S।

संभोग, सॉकेट() केवल एक सिस्टम कॉल है, इसलिए वास्तविक कार्यान्वयन कर्नेल में है। Glibc बस इसे कॉल करने के लिए एक सी रैपर प्रदान करता है।

+0

यह वही था जो मुझे जानने की जरूरत थी। मुझे एक झटका था कि यह एक प्रकार का कंकाल था, लेकिन मुझे नहीं पता था कि कार्यान्वयन को और कहां देखना है। आपका जवाब संक्षेप में, त्वरित और सहायक था। मैं यह देखने का मतलब था कि सॉकेट() के लिए रैपर क्या था और आपकी युक्तियां मुझे खोज जारी रखने में मदद करेंगी! – GRAYgoose124

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

  • कोई संबंधित समस्या नहीं^_^