Có một tập tin cho mỗi ổ cắm?


21

"Mọi thứ là một tập tin" trong Thế giới UNIX.

Trên câu là nổi tiếng. Khi tôi chạy echo "hello programmer" >> /dev/tty1, tôi có thể xem chuỗi đã cho TeleType 1 , ....

Mỗi tập tin là gì và ở đâu socket? Giả sử bạn tôi kết nối với PC của tôi và IP của nó là h.h.h.h, làm thế nào tôi có thể truy cập tệp tương ứng? Có thể không?


3
API socket thực sự là một sai lệch so với "chính sách Unix" về vấn đề này, bởi vì nó ban đầu đến từ BSD . Lưu ý rằng luôn có Kế hoạch 9 từ Bell Labs , "nhiều Unix hơn Unix" - ngay cả API mạng và API đồ họa cũng là các tệp ở đó.
ntoskrnl

các ổ cắm và quy trình được đề cập một số tiền khá lớn trong các bài viết của Kế hoạch 9, chủ yếu nói về việc mô hình UNIX bị lỗi ở đâu.
strugee

Câu trả lời:


9

người đàn ông 7 unix:

Họ ổ cắm AF_UNIX (còn được gọi là AF_LOCAL) được sử dụng để giao tiếp giữa các quy trình trên cùng một máy một cách hiệu quả. Theo truyền thống, các ổ cắm tên miền UNIX có thể không được đặt tên hoặc bị ràng buộc với tên đường dẫn hệ thống tệp (được đánh dấu là loại ổ cắm). Linux cũng hỗ trợ một không gian tên trừu tượng độc lập với hệ thống tệp.

Tức là không phải mọi ổ cắm đều có thể được xem như một tệp (theo nghĩa "không có tệp nào không có tên tệp").

Nhưng có những tập tin với danh sách các socket (ví dụ /proc/net/tcp); mặc dù không chính xác "mọi thứ là một tập tin" nghĩa là gì.


38

Một ổ cắm một tập tin. Nhưng không phải tất cả các tập tin đều có tên. Dưới đây là một vài ví dụ về các tệp không có tên:

  • Bất kỳ tệp nào đã từng có tên và hiện đã bị xóa nhưng vẫn được mở bởi một chương trình.
  • Một ống không tên , chẳng hạn như một ống được tạo bởi |toán tử shell.
  • Hầu hết các socket : bất kỳ ổ cắm Internet hoặc ổ cắm Unix nào không có trong không gian tên hệ thống tập tin (nó có thể nằm trong không gian tên trừu tượng hoặc không được đặt tên).

Các tệp như ống hoặc ổ cắm không tên được tạo bởi một quy trình và chỉ có thể được truy cập trong quy trình đó hoặc trong các quy trình con được tạo sau đó. (Điều này không hoàn toàn đúng: một quy trình có đường ống hoặc ổ cắm (hoặc bất kỳ tệp nào khác) mở có thể truyền nó tới các quy trình khác thông qua ổ cắm Unix; đây được gọi là mô tả tệp đi qua .)

Các ổ cắm có tên (cho dù trong hệ thống tập tin hoặc trừu tượng) có thể được mở bằng tên đó. Ổ cắm mạng có thể được mở (hoặc kết nối chính xác hơn) từ xa từ bất kỳ máy nào có kết nối phù hợp.


Đây là câu trả lời chính xác.
jforberg

4
/proc/<pid>/fd/*/proc/net/*có thể thú vị
n611x007

Hãy chấp nhận câu trả lời này. Đó là IMHO chính xác hơn rất nhiều.
dùng1202136

13

Tập tin trên mỗi ổ cắm là gì và ở đâu?

"Mọi thứ" là một cường điệu. Đây không phải là một chính sách nghiêm ngặt, đó chỉ là một cách phổ biến để sử dụng hệ thống tệp cho giao diện vì quyền truy cập hệ thống tệp đồng nghĩa với các cuộc gọi hệ thống (nghĩa là hệ thống tệp thực sự là giao diện với kernel và do đó cung cấp định dạng thuận tiện cho mọi loại) . Các hệ điều hành khác không sử dụng nhiều như vậy, vì vậy nó được coi là một tính năng khác biệt.

Như Hauke ​​Laging đề cập, các ổ cắm "unix cục bộ" có một nút tệp như các ống được đặt tên (xem man fifo). Tuy nhiên, ổ cắm giao thức internet (được sử dụng cho giao tiếp mạng) thì không. Thay vào đó, chúng được liên kết trong không gian người dùng với số cổng. Lưu ý rằng một ổ cắm máy chủ trên một cổng kết nối nhiều máy khách với một ổ cắm riêng (một tệp ổ cắm cục bộ unix duy nhất cũng có thể được sử dụng theo cách này với một máy chủ, có nghĩa là có thể có nhiều ổ cắm được liên kết với cùng một địa chỉ tệp) và trong mã, trên thực tế chúng được xác định riêng lẻ thông qua các mô tả tệp số riêng biệt .

Vì vậy, theo nghĩa đó, tất cả các socket đều giống như các tập tin và có một liên kết /proc/[pid]/fd/. Bạn thậm chí có thể gọi readlink()vào nút này và nhận được một loại tên tệp đặc biệt, được sử dụng trong các công cụ dòng lệnh như lsof, tôi tin rằng; tương tự như vậy, bạn có thể nhận được thông tin về bộ mô tả ổ cắm thông qua fstat().


Bạn có nghĩa là "được xác định trong không gian người dùng bằng inode của họ"? Không phải mọi ổ cắm đều có số cổng và có thể có một số ổ cắm cho cùng một số cổng (mặc dù không có ý nghĩa gì).
Hauke ​​Laging 23/214

@HaukeLaging: Điểm tốt. Tôi đã chỉnh sửa để làm cho điều này rõ ràng hơn bắt đầu với đoạn thứ hai.
goldilocks
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.