(Hmm: phần sau đây là một chút sử thi ...)
Thiết kế của thư mục trên hệ thống tập tin unix (trong đó, là gàn dở, đang thường nhưng không nhất thiết phải gắn liền với unix OSS) đại diện cho một cái nhìn sâu sắc tuyệt vời, mà thực sự làm giảm số trường hợp đặc biệt cần thiết.
Một 'thư mục' thực sự chỉ là một tệp trong hệ thống tệp. Tất cả nội dung thực tế của các tệp trong hệ thống tệp đều ở dạng inodes (từ câu hỏi của bạn, tôi có thể thấy rằng bạn đã biết về một số nội dung này). Không có cấu trúc nào cho các nút trên đĩa - chúng chỉ là một bó lớn các byte được đánh số, trải đều như bơ đậu phộng trên đĩa. Điều này không hữu ích, và thực sự là không thích hợp với bất cứ ai có đầu óc gọn gàng.
Các chỉ inode đặc biệt là inode số 2 (không phải 0 hoặc 1, vì lý do truyền thống); inode 2 là một tệp thư mục: thư mục gốc . Khi hệ thống gắn kết hệ thống tập tin, nó 'biết' nó phải thực hiện lại ở nút 2, để tự khởi động.
Một tệp thư mục chỉ là một tệp, với cấu trúc bên trong được đọc bởi opendir (3) và bạn bè. Bạn có thể thấy cấu trúc bên trong của nó được ghi lại trong thư mục (5) (tùy thuộc vào hệ điều hành của bạn); nếu bạn nhìn vào đó, bạn sẽ thấy rằng mục nhập tệp thư mục chứa hầu như không có thông tin nào về tệp - đó là tất cả trong tệp inode. Một trong những điều đặc biệt về tệp này là hàm mở (2) sẽ gặp lỗi nếu bạn cố mở tệp thư mục có chế độ cho phép ghi. Nhiều lệnh khác (chỉ chọn một ví dụ hexdump
) sẽ từ chối hành động theo cách thông thường với các tệp thư mục, chỉ vì đó có thể không phải là điều bạn muốn làm (nhưng đó là trường hợp đặc biệt của chúng, không phải của hệ thống tệp).
Một liên kết cứng không gì khác hơn là một mục trong bản đồ của tệp thư mục. Bạn có thể có hai (hoặc nhiều) mục trong một bản đồ mà cả hai ánh xạ tới cùng một số inode: do đó inode có hai (hoặc nhiều) liên kết cứng. Điều này cũng giải thích tại sao mọi tệp có ít nhất một "liên kết cứng". Inode có số tham chiếu, ghi lại số lần inode được đề cập trong tệp thư mục ở đâu đó trong hệ thống tệp (đây là số mà bạn thấy khi bạn thực hiện ls -l
).
OK: chúng ta đang đi đến điểm bây giờ.
Tệp thư mục là bản đồ của các chuỗi ('tên tệp') thành số (số inode). Các số inode đó là số lượng các nút của các tệp nằm trong thư mục đó. Các tệp nằm trong thư mục đó có thể bao gồm các tệp thư mục khác, vì vậy số inode của chúng sẽ nằm trong số các tệp được liệt kê trong thư mục. Vì vậy, nếu bạn có một tệp /tmp/foo/bar
, thì tệp thư mục foo
bao gồm một mục nhập bar
, ánh xạ chuỗi đó sang nút cho tệp đó. Ngoài ra còn có một mục trong tệp thư mục /tmp
, cho tệp thư mục foo
'trong' thư mục /tmp
.
Khi bạn tạo một thư mục với mkdir (2), chức năng đó
- tạo một tệp thư mục (với một số số inode) với cấu trúc bên trong chính xác,
- thêm một mục vào thư mục mẹ, ánh xạ tên của thư mục mới vào inode mới này (chiếm một trong các liên kết),
- thêm một mục vào thư mục mới, ánh xạ chuỗi '.' vào cùng một nút (tài khoản này cho liên kết khác) và
- thêm một mục khác vào thư mục mới, ánh xạ chuỗi '..' vào nút của tệp thư mục mà nó đã sửa đổi ở bước (2) (tài khoản này cho số lượng lớn hơn các liên kết cứng bạn sẽ thấy trên các tệp thư mục chứa thư mục con ).
Kết quả cuối cùng là (hầu hết) các trường hợp đặc biệt duy nhất là:
- Hàm open (2) cố gắng làm cho việc bắn vào chân bạn khó hơn, bằng cách ngăn bạn mở các tệp thư mục để ghi.
- Hàm mkdir (2) làm cho mọi thứ trở nên dễ dàng và dễ dàng bằng cách thêm một vài mục nhập bổ sung ('.' Và '..') vào tệp thư mục mới, hoàn toàn để thuận tiện cho việc di chuyển xung quanh hệ thống tệp. Tôi nghi ngờ rằng hệ thống tập tin sẽ hoạt động hoàn hảo mà không có '.' và '..', nhưng sẽ là một nỗi đau để sử dụng.
- Tệp thư mục là một trong số ít các loại tệp được gắn cờ là 'đặc biệt' - đây thực sự là thứ cho phép những thứ như mở (2) hoạt động hơi khác. Xem
st_mode
trong stat (2).
(được sao chép từ câu hỏi ban đầu stackoverflow, 2011-10-20)
..
cứng, phần mềm đi bộ trên cây của bạn đã cần phải có ngoại lệ "không theo chu kỳ trên liên kết thư mục mẹ" , do đó, nó cũng ít phức tạp hơn ngoại trừ.
liên kết.