Linux xóa một tệp hoàn toàn khác với cách Windows thực hiện. Đầu tiên, một lời giải thích ngắn gọn về cách các tệp được quản lý trong các hệ thống tệp gốc * unix.
Các tập tin được giữ trên đĩa trong cấu trúc đa cấp được gọi i-node
. Mỗi nút i có một số duy nhất trên hệ thống tệp đơn. Cấu trúc nút i giữ thông tin khác nhau về một tệp, như kích thước của nó, các khối dữ liệu được phân bổ cho tệp, v.v., nhưng vì mục đích của câu trả lời này, yếu tố dữ liệu quan trọng nhất là a link counter
. Đây directories
là những tập tin lưu giữ hồ sơ về các tập tin. Mỗi bản ghi có số nút i mà nó đề cập đến, độ dài tên tệp và chính tên tệp. Lược đồ này cho phép một người có 'con trỏ', tức là 'liên kết' đến cùng một tệp ở những nơi khác nhau với các tên khác nhau. Bộ đếm liên kết của nút i thực sự giữ số lượng liên kết tham chiếu đến nút i này.
Điều gì xảy ra khi một số quá trình mở tập tin? Đầu tiên open()
chức năng tìm kiếm bản ghi tập tin. Sau đó, nó kiểm tra xem cấu trúc nút i trong bộ nhớ cho nút i này đã tồn tại chưa. Điều này có thể xảy ra nếu một số ứng dụng đã mở tệp này. Mặt khác, hệ thống khởi tạo cấu trúc nút i trong bộ nhớ mới. Sau đó, hệ thống tăng bộ đếm mở cấu trúc nút i trong bộ nhớ và trả về cho ứng dụng bộ mô tả tệp của nó.
Cuộc gọi thư viện Linux để xóa một tập tin được gọi unlink
. Hàm này loại bỏ bản ghi tệp khỏi một thư mục và làm giảm bộ đếm liên kết của nút i. Nếu hệ thống thấy rằng cấu trúc nút i trong bộ nhớ tồn tại và bộ đếm mở của nó không bằng 0 thì cuộc gọi này trả về điều khiển cho ứng dụng. Mặt khác, nó kiểm tra xem bộ đếm liên kết có bằng không không và nếu có thì hệ thống sẽ giải phóng tất cả các khối được phân bổ cho nút i và nút i và quay lại ứng dụng.
Điều gì xảy ra khi một ứng dụng đóng một tập tin? Hàm này làm close()
giảm bộ đếm mở và kiểm tra giá trị của nó. Nếu giá trị khác không, hàm sẽ trả về ứng dụng. Mặt khác, nó kiểm tra nếu bộ đếm liên kết nút i bằng không. Nếu bằng 0, nó giải phóng tất cả các khối của tệp và nút i trước khi quay lại ứng dụng.
Cơ chế này cho phép bạn "xóa" một tập tin trong khi nó được mở. Đồng thời, ứng dụng đã mở tệp vẫn có quyền truy cập vào dữ liệu trong tệp. Vì vậy, trong ví dụ của bạn, JRE vẫn giữ phiên bản tệp của nó được mở trong khi có một phiên bản cập nhật khác trên đĩa.
Hơn nữa, tính năng này cho phép bạn cập nhật glibc (libc) - thư viện cốt lõi của tất cả các ứng dụng - trong hệ thống của bạn mà không làm gián đoạn hoạt động bình thường của nó.
các cửa sổ
20 năm trước, chúng tôi không biết bất kỳ hệ thống tệp nào khác ngoài FAT trong DOS. Hệ thống tập tin này có cấu trúc và nguyên tắc quản lý khác nhau. Các nguyên tắc này không cho phép bạn xóa một tệp khi nó được mở, do đó, DOS và gần đây Windows phải từ chối mọi yêu cầu xóa trên một tệp đang mở. Có lẽ NTFS sẽ cho phép hành vi tương tự như các hệ thống tệp * nix nhưng Microsoft đã quyết định duy trì hành vi theo thói quen xóa tệp.
Đây là câu trả lời. Không ngắn, nhưng bây giờ bạn có ý tưởng.
Chỉnh sửa : Đọc tốt về các nguồn Win32
gây rối: https://bloss.msdn.microsoft.com/oldnewthing/20040607-00/?p=38993
Tín dụng cho @Jon