Linux (và các UNIX khác) rút ra sự phân biệt giữa tên của một tệp ( liên kết ), chính tệp đó (thường được xác định bằng inode ) và xử lý mở đối với tệp. Khi bạn xóa tệp, bạn gọi cuộc unlink()
gọi - thao tác này sẽ xóa liên kết đến tệp (bạn cũng có thể sử dụng rename()
để ghi đè lên tệp đó bằng một nút khác). Tuy nhiên, nếu mở xử lý đến tập tin (hoặc liên kết khác - các file có thể có nhiều liên kết cứng ) vẫn còn, các inode còn lại, và do đó, nội dung tập tin, cho đến khi tất cả các liên kết và xử lý biến mất.
Vì vậy, việc chạy các chương trình bằng thư viện hoặc bất cứ điều gì giữ một phiên bản xử lý cho phiên bản cũ (thường ngầm thông qua ánh xạ bộ nhớ), vì vậy nó vẫn nằm trên đĩa. Nó không còn có tên tệp nữa và sẽ bị xóa khi tất cả các chương trình sử dụng nó bị tắt (hoặc trong lần khởi động lại tiếp theo, trong quá trình kiểm tra hệ thống tập tin hoặc phát lại tạp chí).
Hơn nữa, lưu ý rằng các chương trình mong đợi 'thư viện cũ' sẽ hoạt động tốt với các phiên bản mới hơn của thư viện. Các thư viện Linux được gán tên tệp ('soname') phản ánh phiên bản ABI (Giao diện nhị phân ứng dụng) do thư viện cung cấp. Ví dụ, thư viện C trên hệ thống của tôi là libc.so.6
. Bất kỳ chương trình nào được biên dịch dựa trên phiên bản libc cũ hơn, nhưng vẫn là phiên bản libc triển khai phiên bản 6 ABI, sẽ hoạt động tốt với nó. Thực sự chương trình cũ sẽ tìm kiếm một libc.so.5
hoặc libc.so.4
hoặc một cái gì đó thay vì; trong trường hợp này, bạn cũng cần giữ phiên bản cũ xung quanh - nhưng vì tên tệp là khác nhau nên đây không phải là vấn đề.