Niektóre programy do kopiowania plików, takie jak, rsync
i curl
mają możliwość wznowienia nieudanych transferów / kopii.
Zauważając, że może być wiele przyczyn tych awarii, w niektórych przypadkach program może wykonać „czyszczenie”, w niektórych przypadkach program nie.
Po wznowieniu działania te programy wydają się po prostu obliczać rozmiar pliku / danych, które zostały pomyślnie przesłane, i po prostu zacząć czytać następny bajt ze źródła i dołączać do fragmentu pliku.
np. rozmiar fragmentu pliku, który „dotarł” do miejsca docelowego wynosi 1378 bajtów, więc po prostu zaczynają czytać od bajtu 1379 na oryginale i dodawać do fragmentu.
Moje pytanie brzmi: wiedząc, że bajty składają się z bitów i nie wszystkie pliki dzielą swoje dane na czyste bajty, skąd te programy wiedzą, że punkt, w którym postanowili rozpocząć dodawanie danych, jest poprawny?
Podczas zapisywania pliku docelowego zachodzi coś w rodzaju buforowania lub „transakcji” podobnych do baz danych SQL, zarówno na poziomie programu, jądra, jak i systemu plików, aby zapewnić, że tylko czyste, dobrze uformowane bajty dotrą do podstawowego urządzenia blokowego?
Czy też programy zakładają, że najnowszy bajt byłby potencjalnie niekompletny, więc usuwają go przy założeniu, że jest zły, kopiują bajt i zaczynają dodawanie stamtąd?
wiedząc, że nie wszystkie dane są reprezentowane jako bajty, domysły te wydają się niepoprawne.
Kiedy te programy „wznawiają”, skąd wiedzą, że zaczynają we właściwym miejscu?
head -c 20480 /dev/zero | strace -e write tee foo >/dev/null
a następnie system operacyjny buforuje je i wysyła na dysk w jeszcze większych porcjach.
fwrite()
?