Một số chương trình sao chép tệp như rsync
và curl
có khả năng tiếp tục chuyển / sao chép không thành công.
Lưu ý rằng có thể có nhiều nguyên nhân của những thất bại này, trong một số trường hợp, chương trình có thể "dọn dẹp" một số trường hợp chương trình không thể.
Khi các chương trình này tiếp tục, chúng dường như chỉ tính kích thước của tệp / dữ liệu được truyền thành công và chỉ bắt đầu đọc byte tiếp theo từ nguồn và nối vào đoạn tệp.
ví dụ: kích thước của đoạn tệp "đã tạo ra" đến đích là 1378 byte, vì vậy họ chỉ bắt đầu đọc từ byte 1379 trên bản gốc và thêm vào đoạn đó.
Câu hỏi của tôi là, biết rằng các byte được tạo thành từ các bit và không phải tất cả các tệp có dữ liệu được phân đoạn theo các đoạn có kích thước byte sạch, làm thế nào để các chương trình này biết chúng là điểm mà chúng đã chọn để bắt đầu thêm dữ liệu là chính xác?
Khi viết tệp đích là một loại bộ đệm hoặc "giao dịch" tương tự như cơ sở dữ liệu SQL xảy ra, ở cấp độ chương trình, kernel hoặc hệ thống tệp để đảm bảo rằng chỉ các byte được tạo sạch, được tạo thành tốt cho thiết bị khối bên dưới?
Hoặc các chương trình giả định rằng byte mới nhất sẽ có khả năng không đầy đủ, vì vậy họ xóa nó với giả định là xấu, lấy lại byte và bắt đầu nối thêm từ đó?
biết rằng không phải tất cả dữ liệu được biểu diễn dưới dạng byte, những dự đoán này có vẻ không chính xác.
Khi các chương trình này "tiếp tục" làm sao họ biết họ đang bắt đầu đúng nơi?
head -c 20480 /dev/zero | strace -e write tee foo >/dev/null
và sau đó, HĐH sẽ đệm chúng lên và gửi chúng vào đĩa trong các khối lớn hơn.
fwrite()
?