Làm thế nào là một thư mục một loại tập tin đặc biệt của người Viking?


23

Tôi đang đọc hướng dẫn Unix này và đã xem qua trích dẫn này ...

Chúng ta nên lưu ý ở đây rằng một thư mục chỉ là một loại tệp đặc biệt.

... nhưng không có lời giải thích hay chi tiết nào được cung cấp. Làm thế nào là một thư mục thực sự chỉ là một tập tin?


Câu trả lời:


19

Nhiều thực thể theo kiểu * nix (và các hệ điều hành khác) được coi là tệp hoặc có khía cạnh giống như tệp xác định, mặc dù chúng không nhất thiết phải là chuỗi byte được lưu trữ trong hệ thống tệp. Chính xác cách thức các thư mục được triển khai phụ thuộc vào loại hệ thống tệp, nhưng nhìn chung những gì chúng chứa, được coi là một danh sách, là một chuỗi các byte được lưu trữ, vì vậy theo nghĩa đó chúng không phải là đặc biệt.

Một cách để xác định "tập tin" là gì trong ngữ cảnh * nix là nó là một cái gì đó có mô tả tệp được liên kết với nó. Theo bài viết trên wikipedia, một mô tả tập tin

là một chỉ báo trừu tượng được sử dụng để truy cập vào tệp hoặc tài nguyên đầu vào / đầu ra khác , chẳng hạn như kết nối đường ống hoặc mạng ...

Nói cách khác, chúng đề cập đến các loại tài nguyên khác nhau từ / đến đó một chuỗi byte có thể được đọc / ghi, mặc dù nguồn / đích của chuỗi đó là không xác định. Nói cách khác, "nơi" của tài nguyên có thể là bất cứ điều gì. Những gì định nghĩa nó là một ống dẫn thông tin. Đây là một phần lý do tại sao đôi khi người ta nói rằng trong unix "mọi thứ là một tập tin". Bạn không nên thực hiện điều đó hoàn toàn theo nghĩa đen, nhưng nó đáng được xem xét nghiêm túc. Trong trường hợp của một thư mục, thông tin này liên quan đến những gì trong thư mục và ở mức độ thực thi thấp hơn, làm thế nào để tìm thấy nó trong hệ thống tập tin.

Các thư mục là loại đặc biệt theo nghĩa này bởi vì trong mã C gốc, chúng không được liên kết rõ ràng với một mô tả tệp; API POSIX sử dụng một loại xử lý luồng đặc biệt , DIR*. Tuy nhiên, loại này trong thực tế có một mô tả cơ bản có thể được lấy ra . Các bộ mô tả được quản lý bởi kernel và truy cập chúng luôn liên quan đến các cuộc gọi hệ thống, do đó, một khía cạnh khác của mô tả là nó là một ống dẫn được điều khiển bởi kernel OS. Chúng có các số duy nhất (trên mỗi quy trình) bắt đầu bằng 0, thường là mô tả cho luồng đầu vào tiêu chuẩn .


2
POSIX.1-2008 thêm một loạt các cuộc gọi hệ thống ( openat, fstatat, vv) mà sử dụng file descriptor đề cập đến các thư mục.
zwol

2
Thú vị hơn nữa, bạn có thể fsync()một thư mục fd chỉ đọc! thành một tập tin tạm thời và đổi tên nó thành "thành ngữ" ban đầu.
Kevin

13

Theo cách làm của Unix: mọi thứ đều là một tập tin.

Một thư mục là một (nhiều) loại tệp đặc biệt. Nó không chứa dữ liệu. Thay vào đó, nó chứa các con trỏ tới tất cả các tệp được chứa trong thư mục.

Các loại tệp đặc biệt khác:

  • liên kết
  • ổ cắm
  • thiết bị

Nhưng vì chúng được coi là "tệp", bạn có thể lsđổi tên chúng và di chuyển chúng và tùy thuộc vào loại tệp đặc biệt, gửi dữ liệu đến / từ chúng.


1
Và điều này làm cho cuộc sống dễ dàng hơn nhiều, bởi vì bạn không phải làm điều gì đó khác đi chỉ vì đó là một thư mục. Điều này áp dụng cho việc viết chương trình cũng như các thao tác từ dòng lệnh (hoặc GUI).
gbarry

1
Một thư mục chứa dữ liệu: dữ liệu mô tả các tệp có trong thư mục. Bạn hoàn toàn có thể truy cập vào một thư mục (mặc dù có lẽ không phải với một cuộc gọi mở tiêu chuẩn) và tự đọc dữ liệu đó (như Bruce Ediger lưu ý trong câu trả lời của anh ấy) dữ liệu không được sử dụng nhiều trừ khi bạn biết định dạng.
jamesqf

11

Câu trả lời của tôi chỉ là sự hồi tưởng, nhưng trong 199x Unix cổ điển, trong đó có rất nhiều, các thư mục là các tệp, chỉ được đánh dấu "thư mục" ở đâu đó trong inode trên đĩa.

Bạn có thể mở một thư mục với cái gì đó giống như open(".", O_RDONLY)và lấy lại một mô tả tập tin có thể sử dụng. Bạn có thể phân tích nội dung nếu bạn /usr/includetìm kiếm và tìm định nghĩa cấu trúc C chính xác. Tôi biết rằng tôi đã làm điều này cho các hệ thống SunOS 4.1.x, hệ thống tệp EFS của SGI và bất kỳ máy trạm Mips-CPU nào của DEC có cho hệ thống tệp, có thể là BSD4.2 FFS.

Đó là một kinh nghiệm tồi tệ. Tiêu chuẩn hóa trên một lớp hệ thống tệp ảo là một điều tốt cho tính di động, ngay cả khi các thư mục không còn là các tệp nghiêm ngặt. Các lớp VFS cho phép chúng tôi thử nghiệm với các hệ thống tệp trong đó các thư mục không phải là các tệp, như ReiserFS hoặc NFS.



1
Bạn vẫn có thể mở một thư mục và đọc nó dưới dạng tệp trên một số biến thể Unix hiện nay, ví dụ như vẫn có thể có trên FreeBSD 10.1. (Có thể nên)
Gilles 'SO- ngừng trở nên xấu xa'

@Gilles Tôi nghĩ sẽ rất logic nếu một thư mục được sao chép bởi dd về cơ bản là tương đương với cp --link dir1/* dir2, mặc dù tôi không chắc về khả năng sử dụng của nó.
peterh nói phục hồi Monica

3

Một thư mục đặc biệt ở chỗ nó có 'd' trong chế độ của nó, nói với hệ thống tệp rằng nó sẽ diễn giải nội dung của nó như một danh sách các tệp khác có trong thư mục, chứ không phải là một tệp thông thường chỉ là một chuỗi byte đọc theo ứng dụng. Đó là tất cả.


Mọi thứ không đơn giản với tất cả các hệ thống tệp - ví dụ, trong HFS + của Apple chỉ có một cây B + lớn chứa tất cả các tên đường dẫn, nếu tôi nhớ chính xác - nhưng quan sát này được phát hiện cho các hệ thống tệp Unix lên đến và bao gồm cả ffs của BSD, có lẽ là những gì các tác giả của hướng dẫn được trích dẫn đã nghĩ đến.
zwol

2

Thư mục là các tệp vì các hệ thống linux sử dụng mô hình i / o phổ quát . Trong mô hình, mọi thứ trong hệ thống là một tệp và nó có thể được truy cập với cùng các lệnh gọi hệ thống và các lệnh khác nhau.

Chúng thuộc loại đặc biệt vì các nút i của chúng có dấu cho loại tệp và chúng có cấu trúc đặc biệt là một bảng tên tệp và liên kết đến các nút i khác. Các cặp tên tệp liên kết này, còn được gọi là "liên kết cứng", trong nút i của một thư mục liệt kê các tệp "bên trong" thư mục.

Thư mục chỉ để tổ chức các tập tin. Khi một tệp được "di chuyển" từ một thư mục sang một thư mục khác, chính tệp đó không di chuyển trong đĩa. Nó chỉ là một mục trong một thư mục i-nút được loại bỏ và được ghi trong một thư mục i-nút khác.


-3

Câu trả lời được chấp nhận là không hoàn toàn chính xác. trong các hệ thống POSIX, "Inodes" trỏ đến các tệp và thư mục. Trình mô tả tệp chỉ là duy nhất cho một quy trình chứ không phải trên toàn hệ thống. Tuy nhiên, các nút là duy nhất, mặc dù nhiều hơn một nút có thể trỏ đến một tệp. Sẽ có nhận xét về câu trả lời được chấp nhận nhưng không thể do hạn chế đại diện.


2
Không, chỉ có 1 nút có thể trỏ đến cùng một tệp. Mặc dù cùng một nút có thể tồn tại đồng thời trong nhiều thư mục (hoặc trên nhiều tên). Một kiểm tra dễ dàng : ls -l >test.txt;ln -vf test.txt test2.txt;ls -li test.txt test2.txt. Vì vậy, bạn sẽ thấy, các liên kết cứng có cùng số inode.
peterh nói rằng phục hồi Monica

@peterh Trình mô tả tệp chỉ là duy nhất cho một quy trình. bạn có thể giải thích?
alamin

1
@ Md.AlaminMahamud Điều đó không đúng, nếu một quá trình fork(), quy trình con của nó sẽ có (ngoại trừ một số trường hợp đặc biệt, cụ thể là một O_CLOEXECcờ) chính xác giống như các thực thể filedescriptor như quy trình ban đầu. Một ví dụ khác: các tiến trình con apache đang listen()ing trên cùng một bộ mô tả tệp socket. Nhưng câu trả lời này không phải là về các bộ mô tả tệp, mà là một cấu trúc dữ liệu bên trong kernel và chỉ tồn tại trong bộ nhớ kernel. Câu trả lời ( sai ) này là về các mục nhập thư mục và các nút, đây là các thực thể trên đĩa (tức là chúng là các byte vật lý trên ổ cứng).
peterh nói phục hồi Monica

1
@ Md.AlaminMahamud Vâng, bây giờ tôi không phải là rất chắc chắn, ví dụ nếu một fork()xảy ra và sau đó là quá trình con seek()s hoặc close()s, nó sẽ không ảnh hưởng đến bộ mô tả tập tin của phụ huynh. Vì vậy, bây giờ tôi đang nghĩ rằng các bộ mô tả tệp chỉ là một phần cấu trúc riêng quy trình. Nhưng câu hỏi này không phải là về họ, câu hỏi này là về các hướng dẫn / inodes và tôi đang bình luận cho bạn về một câu trả lời hoàn toàn sai cho câu hỏi này.
peterh nói phục hồi Monica
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.