Là một thư mục bị loại bỏ khi số lượng liên kết cứng của nó trở thành 0?


10

Là một thư mục bị loại bỏ khi số lượng liên kết cứng của nó trở thành 0?

Một thư mục luôn có ít nhất 2 là số lượng liên kết cứng, bởi vì .. Khi rm -rmột thư mục, nó có làm giảm số lượng liên kết cứng từ 2 xuống 0 thay vì 1 không?

Số lượng liên kết cứng của một thư mục có thể là 1?

Cảm ơn.

Câu trả lời:


9

Thứ nhất, không phải tất cả các hệ thống tập tin đều sử dụng ...làm liên kết cứng. điều này được ghi lại trong hướng dẫn tìm kiếm gnu. Tôi sẽ bỏ qua các hệ thống tập tin đó cho phần còn lại của câu trả lời của tôi vì chúng không được thiết kế cho unix và chỉ làm phức tạp mọi thứ mà không thêm rõ ràng. Tôi cũng sẽ bỏ qua thư mục gốc và các điểm gắn kết vì lý do tương tự.

số lượng liên kết đến một thư mục không bao giờ ít hơn hai vì .... Số lượng thư mục con bằng với số lượng liên kết trừ hai. Bởi vì điều này, bạn không thể liên kết hoặc bỏ liên kết một thư mục, vì vậy rm -rsẽ statlà một tập tin trước khi xóa và sử dụng rmdirthay vì unlinktrên danh bạ. Hai cuộc gọi hệ thống sử dụng các đường dẫn mã hoàn toàn khác nhau trong kernel.


Cảm ơn. Một thư mục có một liên kết cứng .., 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?
Tim

..hiện diện trong mỗi thư mục đó một thư mục con. đó là tất cả nhưng /có một quá, vì vậy tất cả các thư mục.
hildred

1
(1) Nếu một thư mục không có thư mục con, thư mục đó không có liên kết cứng ..với chính nó. Các liên kết cứng đến dir là gì? các tập tin với tên đường dẫn, và .? (2) tại sao bạn bỏ qua điểm gắn kết?
Tim

Nếu thư mục là một thư mục con. mục ..sẽ chỉ đến phụ huynh. Như một trường hợp đặc biệt, liên kết thư mục gốc trỏ đến chính nó. Điều này cho phép cd ..\..và các lệnh tương tự hoạt động như mong đợi cho dù bạn ở đâu. Bạn có thể kiểm tra bằng statlệnh.
BillThor

1
Bạn đúng rằng số lượng liên kết không bao giờ ít hơn 2, nhưng không phải vì ... Đó là vì .và tên trong thư mục mẹ trỏ đến nó. Ngoại lệ duy nhất là root, không có cha mẹ. Nhưng nó đã ..chỉ vào chính nó, vì vậy nó cũng có số lượng liên kết = 2.
Barmar

11

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 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 rmdirgọ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 ...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 ...theo thứ tự đó, sau đó xóa chính thư mục đó, tất cả đều có unlinkgọ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 rmlệnh, tình cờ, ngăn chặn gốc thậm chí từ bỏ các thư mục. Và rm -rsẽ gọi rmdirlệ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 unlinkcuộ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 rmdirhoặc mvhoặ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 dcheckvà vẫn là một trong những kiểm tra fsckvì 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 ...) 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ù ...không xuất hiện trong danh sách, thư mục có thể được mở và statcó thể được gọi với tên .hoặc ... Trên Linux, số lượng liên kết là 0 nhưng ...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 ...đã 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.


2
strcpyđến một mảng có kích thước cố định trong một tập tin thực thi setuid ... đây là những thời điểm tốt!
Andrea Corbellini

@AndreaCorbellini Thực sự có một khai thác được công bố mkdirdựa trên thực tế là nó phải làm điều tương tự ngược lại.
Random832

1
Tôi nghĩ rằng tôi đã tìm thấy nó: securityf
Focus.com/archive/1/365038/2004-05-31/2004-06-06/0

rmdirHỏi về , sẽ không ..gỡ bỏ thư mục cha mẹ?
Edward Torvalds

@edwardtorvalds Không, tôi đã đề cập đến việc loại bỏ liên kết "..", chứ không phải thư mục mẹ mà nó trỏ tới.
Random832
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.