Ad alcuni programmi di copia dei file piace rsync
e curl
hanno la possibilità di riprendere trasferimenti / copie non riusciti.
Notando che ci possono essere molte cause di questi errori, in alcuni casi il programma può "ripulire", in alcuni casi il programma no.
Quando riprendono questi programmi, sembrano semplicemente calcolare la dimensione del file / dei dati che sono stati trasferiti correttamente e iniziare a leggere il byte successivo dalla sorgente e accodarsi al frammento di file.
ad esempio, la dimensione del frammento di file che "l'ha fatto" alla destinazione è 1378 byte, quindi iniziano a leggere dal byte 1379 sull'originale e si aggiungono al frammento.
La mia domanda è, sapendo che i byte sono costituiti da bit e non tutti i file hanno i loro dati segmentati in blocchi di dimensioni di byte puliti, come fanno questi programmi a sapere se il punto in cui hanno scelto di iniziare ad aggiungere i dati è corretto?
Quando si scrive il file di destinazione si verifica una sorta di buffering o "transazioni" simili ai database SQL, a livello di programma, kernel o filesystem per garantire che solo byte puliti e ben formati arrivino al dispositivo a blocchi sottostante?
Oppure i programmi presumono che l'ultimo byte sia potenzialmente incompleto, quindi lo eliminano supponendo che sia danneggiato, ricopiano il byte e iniziano a aggiungere da lì?
sapendo che non tutti i dati sono rappresentati come byte, queste ipotesi sembrano errate.
Quando questi programmi "riprendono" come fanno a sapere che stanno iniziando nel posto giusto?
head -c 20480 /dev/zero | strace -e write tee foo >/dev/null
e quindi il sistema operativo li bufferizzerà e li invierà sul disco in blocchi ancora più grandi.
fwrite()
?