2014-04-16 6 views
5

मैंने कुछ कार्यक्रमों में निम्नलिखित कथन देखा है, अधिकांश/सभी लिनक्स के लिए किए जाने लगते हैं।पढ़ें (एफडी, न्यूल, 0); यह क्या करता है? क्या यह अच्छी तरह से परिभाषित है?

rv = read(fd, NULL, 0); 

कुछ कार्यक्रमों में यह एक ही बयान में, एक लूप में है।

वास्तव में यह क्या करता है?

मैन पेज है कि इस तरह एक मंगलाचरण या त्रुटियों की जांच नहीं हो सकता है ...

वापसी मान का क्या महत्व है कहते हैं?

किस प्रकार के फाइल डिस्क्रिप्टर समर्थित हैं?

और यदि rv==0 उदाहरण से "कोई त्रुटि नहीं" को अलग करने के लिए कैसे करें "सॉकेट बंद"।

उत्तर

7

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

यदि कोई त्रुटि होती है और 0 अन्यथा यह -1 वापस आ जाएगी। man 2 read में सूचीबद्ध अधिकांश त्रुटियों को इस तरह से पूछताछ की जा सकती है और errno में वापस कर दिया जाएगा।

उदाहरण के लिए -1 और errnoEBADF का वापसी मूल्य फ़ाइल डिस्क्रिप्टर बंद होने पर पुन: उपयोग किया जाएगा। इसके बदले वापसी मूल्य 0 होगा यदि सब कुछ अच्छा है और अन्य read फ़ाइल डिस्क्रिप्टर की वैधता से जुड़ी एक त्रुटि नहीं लौटाएगा।

एक एक असली बफर के साथ बाद में read और nbyte > 0 अभी भी ENOMEM, EAGAIN तरह त्रुटियों के किसी भी संख्या उत्पन्न कर सकते हैं, ...

+5

यह मौलिक रूप से गैर-पोर्टेबल लगता है। लिनक्स मैन (3) पृष्ठ पढ़ता है: 'शून्य बाइट्स के पढ़ने() अनुरोधों के लिए त्रुटि जांच करने के लिए कार्यान्वयन की अनुमति है, लेकिन आवश्यक नहीं है।' POSIX कहता है: किसी भी कार्रवाई से पहले, और यदि nbyte शून्य है, तो पढ़ें() फ़ंक्शन * हो सकता है * त्रुटियों का पता लगाने और वापस कर सकता है। – Duck

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