A algunos programas de copia de archivos les gusta rsync
y curl
tienen la capacidad de reanudar transferencias / copias fallidas.
Teniendo en cuenta que puede haber muchas causas de estas fallas, en algunos casos el programa puede hacer una "limpieza" y otros no.
Cuando estos programas se reanudan, parecen simplemente calcular el tamaño del archivo / datos que se transfirieron con éxito y simplemente comienzan a leer el siguiente byte de la fuente y se agregan al fragmento de archivo.
por ejemplo, el tamaño del fragmento de archivo que "llegó" al destino es de 1378 bytes, por lo que comienzan a leer desde el byte 1379 en el original y se agregan al fragmento.
Mi pregunta es, sabiendo que los bytes están formados por bits y no todos los archivos tienen sus datos segmentados en fragmentos limpios de bytes, ¿cómo saben estos programas que el punto que han elegido para comenzar a agregar datos es correcto?
Al escribir el archivo de destino, ¿se produce algún tipo de almacenamiento intermedio o "transacciones" similares a las bases de datos SQL, ya sea a nivel del programa, del núcleo o del sistema de archivos para garantizar que solo los bytes limpios y bien formados lleguen al dispositivo de bloque subyacente?
¿O los programas suponen que el último byte estaría potencialmente incompleto, por lo que lo eliminan suponiendo que es incorrecto, vuelven a copiar el byte y comienzan a agregar desde allí?
sabiendo que no todos los datos se representan como bytes, estas suposiciones parecen incorrectas.
Cuando estos programas "se reanudan", ¿cómo saben que están comenzando en el lugar correcto?
head -c 20480 /dev/zero | strace -e write tee foo >/dev/null
y luego el sistema operativo los almacenará en el búfer y los enviará al disco en fragmentos aún más grandes.
fwrite()
?