Alguns programas de cópia de arquivos gostam rsync
e curl
têm a capacidade de retomar transferências / cópias com falha.
Observando que pode haver muitas causas dessas falhas, em alguns casos o programa pode "limpar" alguns casos que o programa não pode.
Quando esses programas são retomados, eles parecem apenas calcular o tamanho do arquivo / dados que foram transferidos com sucesso e apenas começar a ler o próximo byte da fonte e anexá-lo ao fragmento do arquivo.
por exemplo, o tamanho do fragmento de arquivo que "chegou" ao destino é 1378 bytes; portanto, eles começam a ler o byte 1379 no original e a adicioná-lo ao fragmento.
Minha pergunta é: sabendo que os bytes são compostos de bits e nem todos os arquivos têm seus dados segmentados em blocos de tamanho de bytes limpos, como esses programas sabem se o ponto que eles escolheram para começar a adicionar dados está correto?
Ao gravar o arquivo de destino, ocorre algum tipo de buffer ou "transações" semelhantes aos bancos de dados SQL, no nível do programa, do kernel ou do sistema de arquivos, para garantir que apenas bytes limpos e bem formados cheguem ao dispositivo de bloco subjacente?
Ou os programas assumem que o byte mais recente seria potencialmente incompleto; portanto, eles o excluem por suposição ruim, copiam novamente o byte e iniciam o anexo a partir daí?
sabendo que nem todos os dados são representados como bytes, essas suposições parecem incorretas.
Quando esses programas são retomados, como eles sabem que estão começando no lugar certo?
head -c 20480 /dev/zero | strace -e write tee foo >/dev/null
e, em seguida, o sistema operacional os armazenará em buffer e os enviará para o disco em pedaços ainda maiores.
fwrite()
?