Деякі програми копіювання файлів на зразок rsync
та curl
мають можливість відновити невдалі передачі / копії.
Відзначаючи, що причин цих збоїв може бути багато, в деяких випадках програма може зробити «очищення», а в деяких випадках програма не може.
Коли ці програми поновлюються, вони, здається, просто обчислюють розмір файлу / даних, який був успішно переданий, і просто починають читати наступний байт з джерела та додавати його до фрагмента файлу.
наприклад, розмір фрагмента файлу, який "зробив його" до місця призначення, становить 1378 байт, тому вони просто починають читати з байту 1379 на оригіналі та додавати до фрагменту.
Моє запитання полягає в тому, що, знаючи, що байти складаються з бітів, і не всі файли мають свої дані сегментовані в чисті шматки байтів, як ці програми знають, що вони вирішили обрати початок додавання даних до правильних?
Під час написання цільового файлу відбувається якесь буферизація або "транзакції", подібні до баз даних SQL, або на рівні програми, ядра або файлової системи, щоб гарантувати, що лише чисті, добре сформовані байти переходять у базовий блок пристрою?
Або програми припускають, що останній байт може бути неповним, тому вони видаляють його за умови, що він поганий, копіюють байт і починають додавати звідти?
знаючи, що не всі дані представлені як байти, ці здогадки здаються невірними.
Коли ці програми "відновляться", як вони знають, що вони починаються в потрібному місці?
head -c 20480 /dev/zero | strace -e write tee foo >/dev/null
і тоді ОС буде їх буферувати і відправляти на диск ще більшими шматками.
fwrite()
?