Certains programmes de copie de fichiers aiment rsync
et curl
ont la possibilité de reprendre les transferts / copies ayant échoué.
Notant qu'il peut y avoir de nombreuses causes de ces échecs, dans certains cas, le programme peut "nettoyer" certains cas, le programme ne peut pas.
Lorsque ces programmes reprennent, ils semblent simplement calculer la taille du fichier / des données qui ont été transférés avec succès et commencer à lire le prochain octet de la source et à l'ajouter au fragment de fichier.
Par exemple, la taille du fragment de fichier qui a "atteint" la destination est de 1378 octets, donc ils commencent simplement à lire à partir de l'octet 1379 sur l'original et à ajouter au fragment.
Ma question est, sachant que les octets sont constitués de bits et que tous les fichiers n'ont pas leurs données segmentées en morceaux de taille octet propre, comment ces programmes savent-ils que le point qu'ils ont choisi de commencer à ajouter des données est correct?
Lors de l'écriture du fichier de destination, une sorte de mise en mémoire tampon ou de "transactions" similaires aux bases de données SQL se produit, soit au niveau du programme, du noyau ou du système de fichiers pour garantir que seuls des octets propres et bien formés parviennent au périphérique de bloc sous-jacent?
Ou les programmes supposent-ils que le dernier octet serait potentiellement incomplet, alors ils le suppriment en supposant qu'il est mauvais, recopient l'octet et commencent l'ajout à partir de là?
sachant que toutes les données ne sont pas représentées en octets, ces suppositions semblent incorrectes.
Lorsque ces programmes "reprennent", comment savent-ils qu'ils commencent au bon endroit?
head -c 20480 /dev/zero | strace -e write tee foo >/dev/null
puis le système d'exploitation les mettra en mémoire tampon et les enverra sur le disque en blocs encore plus grands.
fwrite()
?