mô tả tập tin so với tên tập tin


12

Tôi đã tự hỏi sự khác biệt và mối quan hệ giữa các mô tả tập tin và tên tập tin. Có phải tất cả chúng được sử dụng để truy cập các tập tin? Nếu có, theo cách tương tự?

Ví dụ, /dev/fd/0, /dev/stdin, và /proc/self/fd/0là tất cả các liên kết đến /dev/pts/2. Đây là bốn mô tả tập tin, hoặc tên tập tin?


Câu trả lời:


12

Tất cả bốn /dev/fd/0, /dev/stdin, /proc/self/fd/0/dev/pts/2là tên tập tin, cũng như /////dev/../dev/fd//0, /bin/sh, /etc/fstab, /fioejfoeijf, vv Tất cả nhưng điều đó ví dụ cuối cùng có thể sẽ là tên của một tập tin hiện có trên máy của bạn. Tên tệp là một chuỗi có thể chỉ định một tệp trên hệ thống tệp của bạn; trong Linux, bất kỳ chuỗi nào không chứa byte rỗng và dài tối đa 4096 byte là tên tệp hợp lệ. Nhiều người trong số những cái tên này là tương đương, ví dụ như /bin/shlà tương đương với ///bin/sh, /bin/../bin/sh(giả sử /binlà một thư mục hiện có), vv Tất cả những ví dụ tôi đã đưa cho đến nay là tên tập tin tuyệt đối; cũng có tên tệp tương đối, không bắt đầu bằng a /và ý nghĩa của nó phụ thuộc vào thư mục hiện tại.

Thuật ngữ xung quanh tên tệp không phổ biến; đôi khi tên tập tin của Nhật Bản có nghĩa là một đường dẫn đầy đủ đến một tập tin và đôi khi nó có nghĩa là tên của một mục nhập thư mục. Thuật ngữ POSIX là thành phần tên tập tin tên lửa hoặc thành phần tên lửa tên là tên của một mục nhập thư mục và tên đường dẫn tên cho một đường dẫn đầy đủ.

Một bộ mô tả tệp chỉ định một tệp mở trong một quy trình cụ thể. Nhân duy trì một bảng mô tả tập tin cho mỗi quá trình. Mỗi mục trong bảng mô tả tệp cho biết phải làm gì nếu quy trình yêu cầu đọc, viết và các thao tác khác trên bộ mô tả tệp.

Bộ mô tả tệp có thể tương ứng với một tệp và có tên liên quan, nhưng không phải tất cả chúng đều được. Đối với những người làm như vậy, tệp có thể là một tệp thông thường, một thư mục, một tệp thiết bị hoặc một đường ống có tên (còn được gọi là FIFO) (loại được tạo bởi mkfifo); một số hệ thống có khả năng hơn nữa như ổ cắm unix và cửa ra vào. Ví dụ về các mô tả tệp không có tệp có tên được liên kết bao gồm các đường ống (loại được tạo bởi pipe) và các ổ cắm mạng .

/dev/fd/0, /dev/stdin/proc/self/fd/0là tên tập tin (tất cả tương đương) với một ý nghĩa đặc biệt: tất cả họ đều ñònh bất cứ tập tin hiện đang truy cập thông qua mô tả tập tin 0. Khi một quá trình mở này, các bản kernel entry với chỉ số 0 trong bảng mô tả mô tả tập tin vào một mới mô tả. Mở bất kỳ tệp nào trong số này tương đương với gọi dup(0). Các tệp được đặt tên là một cách gián tiếp để có được một quy trình sử dụng một trong các tệp đã mở của nó thay vì mở một tệp mới; chúng hầu như rất hữu ích để truyền vào dòng lệnh của chương trình, trong đó chương trình hy vọng tên của tệp sẽ mở.


@Giles Bạn đã viết "Mỗi mục trong bảng mô tả tệp cho biết phải làm gì nếu quy trình yêu cầu đọc, viết và các thao tác khác trên bộ mô tả tệp." ( Nhấn mạnh của tôi). Theo như tôi hiểu thì nó chỉ là một số nguyên như tiêu chuẩn 0,1,2 vv cho stdin, stdout và stderr tương ứng. Nó sẽ là số có giá trị cao hơn cho các tập tin thông thường. Điều tôi không nhận được từ nhận xét của bạn là cách con số này cho biết "phải làm gì nếu quy trình yêu cầu đọc, viết và các thao tác khác trên bộ mô tả tệp." . Bạn có thể vui lòng mở rộng về điều này một chút?
Geek

@Geek Một mục trong bảng mô tả tệp không phải là số. Số là chỉ số vào bảng đó.
Gilles 'SO- ngừng trở nên xấu xa'

@Giles cảm ơn vì đã làm rõ sự hiểu lầm của tôi. Tôi hiểu nó tốt hơn bây giờ. Vì vậy, bạn có thể vui lòng cho một ví dụ về phần "phải làm gì" trong câu trả lời của bạn. Tôi đã tập hợp rằng mỗi mục trong bảng mô tả tệp một lần nữa có một con trỏ tới bảng tệp chứa thông tin như tệp bù, trạng thái tệp, v.v. Nhưng tôi vẫn chưa rõ phần "phải làm gì" trong câu trả lời của bạn.
Geek

2

Tên tệp chỉ là tên của tệp trên hệ thống tệp, không có gì khác - nó chỉ là một chuỗi.

Mô tả tệp là một số loại đối tượng, từ đó bạn có thể đọc và / hoặc viết. Đó là mở và sẵn sàng tập tin. Không chỉ có các mô tả tệp - stdin, stdout và stderr cũng là các mô tả, bạn có thể viết và đọc từ chúng bằng cách sử dụng các chức năng hoàn toàn giống như với các tệp (trừ ví dụ bạn không thể tìm kiếm). Các ví dụ khác về các mô tả không phải là tệp là: ống được đặt tên và ổ cắm mạng.

Trong mã, mô tả tệp là một biến, con trỏ tới một cái gì đó trong kernel, đại diện cho đối tượng tệp.

Ví dụ: / dev / fd / 0, / dev / stdin, / Proc / self / fd / 0 là tất cả các liên kết đến / dev / pts / 2. Đây là bốn mô tả tập tin, hoặc tên tập tin?

Tất cả đều là tệp giả, có thể hữu ích cho một số tập lệnh hoặc chương trình. Bạn có thể mở chúng và open () sẽ trả về cho bạn một bộ mô tả tệp.

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.