以下のようないくつかのファイルコピープログラムrsync
とは、curl
失敗した転送/コピーを再開する能力を持っています。
これらの失敗の多くの原因が存在する可能性があることに注意してください。場合によっては、プログラムができない「クリーンアップ」を行うことができます。
これらのプログラムが再開すると、正常に転送されたファイル/データのサイズを計算し、ソースから次のバイトの読み取りを開始し、ファイルフラグメントに追加するだけのようです。
たとえば、宛先に「作成」されたファイルフラグメントのサイズは1378バイトなので、元のバイト1379から読み取りを開始し、フラグメントに追加します。
私の質問は、バイトがビットで構成されており、すべてのファイルのデータがきれいなバイトサイズのチャンクにセグメント化されているわけではないことを知っています。これらのプログラムは、データの追加を開始することを選択したポイントが正しいことをどのように知るのですか?
宛先ファイルの書き込み時に、プログラム、カーネル、またはファイルシステムレベルで発生するSQLデータベースに似た何らかのバッファリングまたは「トランザクション」が行われ、クリーンで整形式のバイトのみが基礎となるブロックデバイスに送られるようにしますか?
または、プログラムは最新のバイトが不完全である可能性があると想定しているので、不良であると想定して削除し、バイトを再コピーしてそこから追加を開始しますか?
すべてのデータがバイトとして表されるわけではないことを知っているため、これらの推測は間違っているように見えます。
これらのプログラムが「再開」するとき、適切な場所から開始していることをどのようにして知るのでしょうか?
head -c 20480 /dev/zero | strace -e write tee foo >/dev/null
。OSはそれらをバッファリングし、さらに大きなチャンクでディスクに送信します。
fwrite()
?