Điều đang diễn ra khá đơn giản: bạn là làm trống tệp.
Tại sao số điện thoại đầy đủ là ^@
thì bạn hỏi? Vâng, trong một ý nghĩa rất thực tế, nó không phải là. Nó không chứa những ký tự lạ. Nó có một "lỗ".
Các chương trình được viết vào tập tin được viết một tập tin đã được mở với O_WRONLY
(hoặc có lẽ O_RDWR
) nhưng khôngO_APPEND
. Chương trình này đã viết, ví dụ: 65536 byte vào tệp tại thời điểm bạn xóa tệp bằng cp /dev/null filename
hoặc : > filename
hoặc một số lệnh tương tự.
Bây giờ, chương trình sẽ chuyển đến write
một đoạn dữ liệu khác (ví dụ: 4096 hoặc 8192 byte). Dữ liệu đó sẽ được ghi ở đâu? Câu trả lời là: "tại hiện tại tìm kiếm bù đắp trên mô tả tập tin cơ bản". Nếu chương trình được sử dụng O_APPEND
, thì write
sẽ có hiệu lực trước một cuộc gọi lseek
đã thực hiện "tìm kiếm tệp kết thúc hiện tại, tức là, thời lượng tệp hiện tại". Khi bạn cắt bớt tập tin mà "kết thúc tập tin hiện tại" sẽ trở thành số không (tập tin trở nên trống rỗng) để tìm kiếm sẽ di chuyển các write
bù đắp cho vị trí 0 và ghi sẽ đi đến đó. Tuy nhiên, chương trình không sử dụng O_APPEND
, do đó không có hoạt động tiền tố write
"đặt lại vị trí" và byte dữ liệu được ghi ở mức bù hiện tại (trong đó, một lần nữa, chúng tôi đã xác nhận là 65536 ở trên).
Bây giờ bạn có một tập tin mà không có dữ liệu trong offsets byte 0 đến 65535 đã bao gồm, tiếp theo là một số dữ liệu trong offsets byte 65536 qua 73.727 (giả sử các write
viết 8192 byte). Dữ liệu "thiếu" đó là "lỗ hổng" trong tệp. Khi một số chương trình khác đọc tệp, hệ điều hành giả vờ có là dữ liệu ở đó: tất cả dữ liệu không phải byte.
Nếu chương trình thực hiện các hoạt động write
không thực hiện chúng trên các ranh giới khối, hệ điều hành sẽ phân bổ một số dữ liệu bổ sung (để vừa chữ viết thành toàn bộ khối) và xóa nó ra. Những byte 0 không phải là một phần của "lỗ hổng" (chúng thực sự là 0 byte trong tệp), nhưng đối với các chương trình thông thường không nhìn phía sau bức màn tại Wizard of Oz, "lỗ" zero-byte và "non -hàng "zero byte không thể phân biệt được.
Điều bạn cần làm là sửa đổi chương trình để sử dụng O_APPEND
hoặc sử dụng thói quen thư viện như syslog
biết cách hợp tác với các thao tác xoay vòng hoặc có thể cả hai.
[Chỉnh sửa để thêm: không chắc chắn lý do tại sao điều này đột nhiên xuất hiện trên trang đầu và tôi đã trả lời câu hỏi từ năm 2011 ...]
echo ""> tên tệp? –
Tại sao bạn viết '@@@@' khi bạn thực sự thấy '^ @^@^@^@'? – glglgl
@gigigi sửa chữa bài –