Linux đang làm gì khác nhau cho phép tôi xóa / thay thế các tệp trong đó Windows sẽ khiếu nại tệp hiện đang sử dụng?


29

Ví dụ tôi có là Minecraft. Khi chạy Bukkit trên Linux, tôi có thể xóa hoặc cập nhật các tệp .jar trong thư mục / plugin và chỉ cần chạy lệnh 'tải lại'.

Trong Windows, tôi phải gỡ bỏ toàn bộ quá trình máy chủ vì nó sẽ phàn nàn rằng tệp .jar hiện đang được sử dụng khi tôi cố gắng xóa hoặc thay thế nó.

Điều này là tuyệt vời với tôi, nhưng tại sao nó xảy ra? Linux đang làm gì khác ở đây?

Câu trả lời:


34

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 directorieslà 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 Win32gây rối: https://bloss.msdn.microsoft.com/oldnewthing/20040607-00/?p=38993 Tín dụng cho @Jon


1
Đã thử đổi tên tệp plugin khi máy chủ đang chạy: i.imgur.com/xibyF.png
MetaGuru

mở cửa sổ cmd, thay đổi thư mục này và sử dụng ren MonsterB.jar MonsterB.ja_- nó sẽ hoạt động. Nó hoạt động cho các tập tin dll và exe chắc chắn.
Serge

1
không, Windows ánh xạ các phần của tệp thực thi vào bộ nhớ
Serge

9
NTFS thực sự hỗ trợ nó, nhưng fopenlệnh Thư viện C gọi CreateFilebằng FILE_SHARE_DELETEcờ, vì vậy nó không cho phép đối với hầu hết các chương trình mở tệp.
Random832

2
Liên kết bắt buộc Raymond Chen: blog.msdn.microsoft.com/oldnewthing/20040607-00/?p=38993
Jon
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.