2012-01-17 12 views
5

लिनक्स पर अवरुद्ध सॉकेट का उपयोग करते समय, send() के लिए अनुरोध किया गया था, अन्य बाधित से कम लौटने के लिए कोई कारण नहीं है, लेकिन आंशिक रूप से सफल send() syscall?कब() लम्बाई तर्क से कम लौटाएगा?

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

Why is it assumed that send may return with less than requested data transmitted on a blocking socket? अनिर्णायक परिणाम के साथ एक ही सवाल पूछने, था: बाधित syscalls एक छोटी वापसी की गिनती के लिए एक उदाहरण के रूप में उल्लेख किया जाता है, लेकिन यह अभी भी है कि क्या एक पूर्ण टीसीपी भेजने बफर एक आंशिक भेजने का कारण होता है स्पष्ट नहीं है या send() बस जब तक को ब्लॉक कर देगा बफर में पर्याप्त जगह है।

उत्तर

4

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

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

+0

FWIW, मेरे लिनक्स बॉक्स पर 'send()' के लिए मैन पेज का कहना है, 'जब संदेश सॉकेट के प्रेषण बफर में फिट नहीं होता है, तो सामान्य रूप से ब्लॉक भेजता है, जब तक सॉकेट को अनब्लॉकिंग में नहीं रखा जाता है I/हे मोड नॉनब्लॉकिंग मोड में यह इस मामले में EAGAIN या EWOULDBLOCK त्रुटि के साथ विफल हो जाएगा। 'ऐसा लगता है कि फ़ंक्शन को इसके' लेन 'तर्क (या त्रुटि पर '-1') के अलावा कुछ भी लौटने के रूप में प्रतीत नहीं होता है। –

+2

लिनक्स मैन पेज कुख्यात अस्पष्ट हैं। आप बीएसडी सिस्टम पर पेज की जांच करने से काफी बेहतर हैं। रिटर्न वॉल्यूम अनुभाग दस्तावेज है कि यह केवल गारंटी के बिना भेजे गए अक्षरों की संख्या देता है कि यह अनुरोध की गई संख्या के समान है। –

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