Bất kỳ tệp nào trên hệ thống tệp UNIX được thiết kế theo quy ước có số tham chiếu (ví dụ: tổng số lượng liên kết cứng và số lượng xử lý tệp mở *) đạt 0 sẽ bị xóa. Tuy nhiên, trên các hệ thống UNIX hiện đại, lệnh rmdir
gọi hệ thống sẽ loại bỏ một thư mục trống trong một thao tác thay vì xóa .
và ..
từng cái một.
Tuy nhiên, trong các hệ thống UNIX lịch sử, cuộc gọi hệ thống này không tồn tại. Thay vào đó, rmdir
lệnh là một chương trình setuid ( có thể tìm thấy mã nguồn ở đây ) để kiểm tra xem một thư mục có trống không (trừ các mục đặc biệt), sau đó xóa ..
và .
theo thứ tự đó, sau đó xóa chính thư mục đó, tất cả đều có unlink
gọi hệ thống mà chỉ root mới được phép sử dụng trên các thư mục (do đó tại sao lệnh được setuid). Vì vậy, trên các hệ thống đó, số liên kết của một thư mục trong giây lát sẽ là 1 sau khi .
bị xóa nhưng trước khi thư mục bị xóa khỏi thư mục mẹ, thì nó sẽ là 0.
Các rm
lệnh, tình cờ, ngăn chặn gốc thậm chí từ bỏ các thư mục. Và rm -r
sẽ gọi rmdir
lệnh để loại bỏ các thư mục sau khi làm trống nội dung của chúng.
Trên các hệ thống lịch sử này, việc lạm dụng unlink
cuộc gọi từ chương trình đang chạy bằng root, chạy trong điều kiện cuộc đua với rmdir
hoặc mv
hoặc tạo tệp trong quy trình có thư mục hiện tại đã bị xóa (hệ thống hiện đại ngăn chặn điều này), có thể dẫn đến các tệp hoặc thư mục bị treo có số lượng liên kết cứng trên 0 nhưng không tồn tại trong cây thư mục. Tình trạng này được phát hiện bởi dcheck
và vẫn là một trong những kiểm tra fsck
vì nó vẫn có thể thực hiện được trên hầu hết các hệ thống tập tin.
Các hệ thống tập tin, ngẫu nhiên, không bắt buộc phải thực hiện các thư mục (bao gồm .
và ..
) như các tệp bình thường có liên kết cứng. Trên các hệ thống tệp này, số lượng liên kết cứng của một thư mục sẽ luôn được báo cáo là 0
(nhưng tất nhiên, sự tồn tại của nó trong thư mục mẹ đủ điều kiện cho "số tham chiếu" là 1).
Hành vi của một thư mục bị xóa (ví dụ: khi được kiểm tra bởi một quá trình đã mở hoặc có thư mục hiện tại) và ý nghĩa chính xác của "số lượng liên kết" của một thư mục là không xác định. Chẳng hạn, trên Mac OS X, nó sẽ báo cáo số lượng liên kết cứng là 2 , mặc dù nó không có liên kết cứng thực sự. Mặc dù .
và ..
không xuất hiện trong danh sách, thư mục có thể được mở và stat
có thể được gọi với tên .
hoặc ..
. Trên Linux, số lượng liên kết là 0 nhưng .
và ..
tương tự như vậy vẫn làm việc.
Mac OS X cũng báo cáo số lượng của tất cả các tệp trong một thư mục là số lượng liên kết, thay vì chỉ số lượng thư mục con. Nhưng nó là 2 ngay cả khi .
và ..
đã biến mất.
* Điều này bao gồm các mô tả mở bình thường, các phần được ánh xạ bộ nhớ (bao gồm cả việc thực thi các tệp nhị phân và thư viện dùng chung) và xử lý các thư mục hiện tại.
..
, chỉ khi nó có thư mục con, đúng không? Vì vậy,..
không phải lúc nào cũng có mặt cho một thư mục, phải không?