让我们想象一下这种情况:
文件在循环中连续附加文本,while true
迭代之间没有睡眠。
while true
do
echo "foo" >> source.file
done
启动另一个进程,将文件复制到另一个位置cp
。rsync
我注意到文件是以特定大小复制的(我猜复制过程开始时源文件的大小),然后复制过程结束。
由于在复制过程运行期间文件的大小不断增加,它如何知道何时停止复制?
答案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 控制器),则复制将“永远”停止。