कुछ फाइल कॉपी करने वाले प्रोग्राम जैसे rsync
और curl
फेल ट्रांसफर / कॉपी फिर से शुरू करने की क्षमता रखते हैं।
यह देखते हुए कि इन विफलताओं के कई कारण हो सकते हैं, कुछ मामलों में कार्यक्रम "क्लीनअप" कर सकता है कुछ कार्यक्रम जो नहीं कर सकते हैं।
जब ये प्रोग्राम फिर से शुरू होते हैं, तो वे केवल उस फ़ाइल / डेटा के आकार की गणना करने लगते हैं जो सफलतापूर्वक स्थानांतरित कर दिया गया था और स्रोत से अगले बाइट को पढ़ना शुरू कर दिया और फ़ाइल के टुकड़े पर जोड़ दिया।
उदाहरण के लिए, फ़ाइल के टुकड़े का आकार जो "गंतव्य पर बना है" 1378 बाइट्स है, इसलिए वे मूल पर बाइट 1379 से पढ़ना शुरू करते हैं और टुकड़े में जोड़ते हैं।
मेरा सवाल है, यह जानते हुए कि बाइट्स बिट्स से बने होते हैं और सभी फाइलों ने अपने डेटा को साफ बाइट के आकार के खंडों में विभाजित नहीं किया है, इन कार्यक्रमों को कैसे पता चलता है कि उन्होंने जिस बिंदु को चुना है वह डेटा जोड़ने के लिए शुरू करना सही है?
गंतव्य फ़ाइल को लिखते समय किसी तरह का बफ़रिंग या "ट्रांज़ेक्शन" SQL डेटाबेस के समान होता है, या तो प्रोग्राम में, कर्नेल या फाइलसिस्टम स्तर पर यह सुनिश्चित करने के लिए कि केवल साफ, अच्छी तरह से बनाई गई बाइट्स इसे अंतर्निहित ब्लॉक डिवाइस में बनाती हैं?
या क्या कार्यक्रम मान लेते हैं कि नवीनतम बाइट संभावित रूप से अधूरी होगी, इसलिए वे इसे अपनी खराब धारणा पर हटाते हैं, बाइट को फिर से याद करते हैं और वहां से एपिंग शुरू करते हैं?
यह जानते हुए कि सभी डेटा बाइट्स के रूप में नहीं दिखाए जाते हैं, ये अनुमान गलत लगते हैं।
जब ये कार्यक्रम "फिर से शुरू" करते हैं, तो उन्हें कैसे पता चलेगा कि वे सही जगह पर शुरू कर रहे हैं?
head -c 20480 /dev/zero | strace -e write tee foo >/dev/null
और फिर OS उन्हें बफ़र करेगा और डिस्क को और भी बड़े चंक्स में भेजेगा।
fwrite()
?