大小不断增大的文件如何复制

大小不断增大的文件如何复制

让我们想象一下这种情况:

文件在循环中连续附加文本,while true迭代之间没有睡眠。

while true
do
echo "foo" >> source.file
done 

启动另一个进程,将文件复制到另一个位置cprsync我注意到文件是以特定大小复制的(我猜复制过程开始时源文件的大小),然后复制过程结束。

由于在复制过程运行期间文件的大小不断增加,它如何知道何时停止复制?

答案1

当您复制只有 27 字节大 ( ) 的文件时,会发生这种情况strace cp a b

read(3, "Who\222s there?\nIt's just me!\n", 131072) = 27
write(4, "Who\222s there?\nIt's just me!\n", 27) = 27
read(3, "", 131072)                     = 0

尽管cp知道大小(并且在复制过程中不会改变),但cp尝试读取最多 128K 的数据。如果 aread()传递零字节,它将停止复制。这是到达文件末尾的标志。

如果复制过程读取数据的速度比写入数据的速度慢(例如,由于不同的 I/O 优先级或其他 I/O 限制,如 cgroups 控制器),则复制将“永远”停止。

相关内容