बफर में लगातार 4K बाइट्स लिखना क्यों छोड़ता है?


30

मेरे पास अनिवार्य रूप से निम्नलिखित कोड है:

int fileWrite(int file, void * pBuffer, size_t size)
{
    size_t bytesWritten = (size_t)write( file, pBuffer, size ) ;
    if (bytesWritten != size)
    {
       return -1;
    }
    return 0;
}

यह काम करता है यदि आकार 1GB है, लेकिन जब आकार ~ 2GB है, तो इसे 4K बाइट्स लगातार छोड़ दिया जाता है। मैं इसे लूप में लिखकर और बफर को ऊपर ले जाकर ठीक कर सकता हूं लेकिन मैं उत्सुक हूं कि यह हमेशा विफल क्यों होता है।

उदाहरण के लिए यदि आकार 2147483648 है, तो केवल 2147479552 लिखें, जिसमें 4096 अलिखित हो। ऐसा क्यों होता है और क्या लूप में लिखना हमेशा सही होता है?


2
क्या आप इसे 32-बिट मोड में चला रहे हैं? 2gig अधिकतम 32-बिट संख्या है।
बरमार

2
writeएक बार में कितने डेटा की खपत होगी , इसके लिए नियम इस पर निर्भर करते हैं कि किस प्रकार का डेटा सिंक fileहै (उदाहरण के लिए "नियमित" फ़ाइल, पाइप, स्ट्रीम सॉकेट, डेटाग्राम सॉकेट, ...)। क्या आप अधिक विशिष्ट हो सकते हैं?
zwol

7
रुको, क्या आप writeएक बार में पूरी फ़ाइल के लिए प्रयास कर रहे हैं ? सामान्य दृष्टिकोण डेटा को एक बफर-आकार को एक बार में स्ट्रीम करना है जब तक आप सब कुछ नहीं लिखते हैं।
लुआण

4
@ Luaan यदि आपके पास पहले से ही सभी डेटा हैं, तो मुझे नहीं लगता कि यह सब कुछ गलत है , लेकिन यह प्रश्न और उत्तर दिखाता है, write()यह सब लिखना नहीं है (जो छोटे बफ़र्स के लिए भी जाता है)
पाइप

8
"मैं इसे लूप में लिखकर ठीक कर सकता हूं" और आपको SSIZE_MAXप्रतिबंध की परवाह किए बिना ज़रूरत है । write()कल्पना यह पूर्ण बफर लिखने के लिए बाध्य नहीं है, भले ही यह लगभग हमेशा करता है कहते हैं। प्रश्न में लूप-कम कोड एक बग है।
एडम

जवाबों:


50

आप इसका उत्तर पा सकते हैं man 2 write:

यदि यह संख्या अनुरोधित बाइट्स की संख्या से छोटी है तो यह कोई त्रुटि नहीं है; यह उदाहरण के लिए हो सकता है क्योंकि डिस्क डिवाइस भरा हुआ था।


और write()मैन पेज विवरण से:

ssize_t write(int fd, const void *buf, size_t count);

POSIX.1 के अनुसार, यदि countइससे अधिक है SSIZE_MAX, तो परिणाम कार्यान्वयन-परिभाषित है; लिनक्स पर ऊपरी सीमा के लिए NOTES देखें।

टिप्पणियाँ

लिनक्स पर, write()(और इसी तरह की सिस्टम कॉल) अधिकांश 0x7ffff000(2,147,479,552) बाइट्स में ट्रांसफर होगी , बाइट्स की संख्या को वास्तव में स्थानांतरित कर देगी। (यह 32-बिट और 64-बिट सिस्टम दोनों पर सच है।)

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.