บางโปรแกรมคัดลอกไฟล์เช่นrsync
และcurl
มีความสามารถในการดำเนินการถ่ายโอน / สำเนาล้มเหลว
สังเกตว่าอาจมีสาเหตุหลายประการของความล้มเหลวเหล่านี้ในบางกรณีโปรแกรมสามารถทำการ "ล้างข้อมูล" ในบางกรณีโปรแกรมไม่สามารถทำได้
เมื่อโปรแกรมเหล่านี้ทำงานต่อพวกเขาดูเหมือนจะคำนวณขนาดของไฟล์ / ข้อมูลที่ถ่ายโอนได้สำเร็จและเพิ่งเริ่มอ่านไบต์ถัดไปจากแหล่งที่มาและผนวกเข้ากับส่วนของไฟล์
เช่นขนาดของไฟล์แฟรกเมนต์ที่ "ทำให้เป็น" ไปยังปลายทางคือ 1378 ไบต์ดังนั้นพวกเขาจึงเริ่มอ่านจากไบต์ 1379 บนต้นฉบับและเพิ่มลงในแฟรกเมนต์
คำถามของฉันคือการรู้ว่าไบต์นั้นประกอบไปด้วยบิตและไม่ใช่ไฟล์ทั้งหมดที่แบ่งข้อมูลเป็นกลุ่มขนาดไบต์ที่สะอาดโปรแกรมเหล่านี้รู้ได้อย่างไรว่าพวกเขาเลือกที่จะเริ่มเพิ่มข้อมูลให้ถูกต้องได้อย่างไร
เมื่อเขียนไฟล์ปลายทางจะมีการบัฟเฟอร์หรือ "การทำธุรกรรม" คล้ายกับฐานข้อมูล SQL ที่เกิดขึ้นไม่ว่าจะเป็นที่ระดับเคอร์เนลของโปรแกรมหรือระบบไฟล์
หรือโปรแกรมสันนิษฐานว่าไบต์ล่าสุดอาจไม่สมบูรณ์ดังนั้นพวกเขาจึงลบมันโดยสมมติว่ามันเลวร้ายแล้วทำการคัดกรองไบต์ใหม่และเริ่มต้นการต่อท้ายจากที่นั่น?
เมื่อรู้ว่าไม่ใช่ข้อมูลทั้งหมดที่แสดงเป็นไบต์การคาดเดาเหล่านี้ดูเหมือนจะไม่ถูกต้อง
เมื่อโปรแกรมเหล่านี้ "กลับมา" พวกเขารู้ได้อย่างไรว่าพวกเขาเริ่มต้นในที่ที่ถูกต้อง?
head -c 20480 /dev/zero | strace -e write tee foo >/dev/null
จากนั้นระบบปฏิบัติการจะบัฟเฟอร์บัฟเฟอร์เหล่านั้นและส่งไปยังดิสก์ในกลุ่มก้อนที่ใหญ่กว่า
fwrite()
ไงดี?