某些文件复制程序类似,rsync
并且curl
能够恢复失败的传输/复制。
注意这些失败可能有很多原因,在某些情况下程序可以执行“清理”,在某些情况下程序无法执行。
当这些程序恢复时,它们似乎只是在计算成功传输的文件/数据的大小,然后才开始从源中读取下一个字节并将其附加到文件片段上。
例如,“到达目的地”的文件片段的大小为1378字节,因此它们只是从原始文件的1379字节开始读取并添加到片段中。
我的问题是,知道字节是由位组成的,并且并非所有文件的数据都按原始字节大小的块进行分段,这些程序如何知道它们选择开始向其添加数据的正确点呢?
在写目标文件时,是否在程序,内核或文件系统级别发生某种类似于SQL数据库的缓冲或“事务”,以确保只有干净,格式正确的字节才能到达基础块设备?
还是程序假设最新的字节可能不完整,所以他们假设它坏了就将其删除,重新复制该字节并从那里开始追加?
知道并非所有数据都以字节表示,所以这些猜测似乎是不正确的。
当这些程序“恢复”时,他们如何知道它们从正确的位置开始?
head -c 20480 /dev/zero | strace -e write tee foo >/dev/null
,然后操作系统将对其进行缓冲,并以更大的块将其发送到磁盘。
fwrite()
?