Là các tập tin ổ cắm Internet Unix?


23

Tôi hiểu rằng "Mọi thứ là một tệp" là một trong những khái niệm chính của Unix, nhưng các socket sử dụng các API khác nhau được cung cấp bởi kernel (như socket, sendto, recv, v.v.), không giống như các giao diện hệ thống tệp thông thường.

Làm thế nào để "Mọi thứ là một tập tin" áp dụng ở đây?

Câu trả lời:


26

ổ cắm sử dụng các API khác nhau

Điều đó không hoàn toàn đúng. Có một số chức năng bổ sung để sử dụng với ổ cắm, nhưng bạn có thể sử dụng, ví dụ: bình thường read()write()trên ổ cắm fd.

Làm thế nào để "Mọi thứ là một tập tin" áp dụng ở đây?

Theo nghĩa là một mô tả tập tin có liên quan.

Nếu định nghĩa của bạn về "tệp" là một chuỗi các byte riêng biệt được lưu trữ trong một hệ thống tệp, thì không phải mọi thứ đều là một tệp. Tuy nhiên, nếu định nghĩa về tệp của bạn được xử lý nhiều hơn như - một ống dẫn thông tin, tức là kết nối I / O - thì "mọi thứ là một tệp" bắt đầu có ý nghĩa hơn. Những điều này chắc chắn liên quan đến chuỗi byte, nhưng chúng đến từ đâu hoặc đến có thể khác nhau theo ngữ cảnh.

Nó không thực sự có ý định theo nghĩa đen, tuy nhiên. Một daemon không phải là một tập tin, một daemon là một quá trình; nhưng nếu bạn đang thực hiện IPC, phương pháp liên quan đến quá trình khác của bạn có thể được giảm bớt bởi các thực thể kiểu tệp.


5
Tôi muốn nói rằng việc đọc lại chính xác "mọi thứ là một tệp" phải là "tất cả các giao diện đều thông qua các tệp". Bạn tương tác với các quy trình thông qua các tệp (stdin / out / err, / Proc / $ pid, v.v.). Bạn tương tác với mạng thông qua các tệp (ổ cắm / mô tả tệp). Bạn tương tác với chuột thông qua một tệp (/ dev / mouse).
Patrick

Tôi đã từng nhân bản một tay cầm ổ cắm bằng cách mở nó ra khỏi / Proc.
Joshua

12

"Mọi thứ là một tập tin" chỉ là một lời nói quá. Nó tiểu thuyết vào những năm 1970 và nó một đặc điểm phân biệt chính của UNIX. Nhưng đó chỉ là một khái niệm tiếp thị, không phải là nền tảng thực sự của UNIX, vì rõ ràng nó không đúng. Nó không có lợi hoặc hợp lý để coi MỌI THỨ như một tập tin.

CPU có phải là một tập tin không? Chương trình của bạn có đọc () CPU để nhận hướng dẫn mới không? RAM có phải là một tập tin không? Chương trình của bạn có đọc () byte tiếp theo không?

Trước đó, có những loại HĐH cung cấp cho bạn một API cho đĩa mềm và API khác cho đĩa cứng, API khác cho băng từ và một loạt API khác nhau cho các thiết bị đầu cuối khác nhau, v.v. Các hệ thống máy tính lớn của IBM có các loại tệp khác nhau trên các đĩa cứng và cung cấp cho bạn một API khác nhau cho mỗi loại, tin hay không! Vì vậy, cách tiếp cận "nó là một tệp" của UNIX, cùng với cách tiếp cận "stdin / stdout / stderr", đã mang đến một sự trừu tượng rất thanh lịch cho cả người dùng và lập trình viên.

Với mạng, sự trừu tượng đặc biệt này không thành công. Và không có hại gì, chỉ hơi kém về sự thanh lịch và sự gắn kết của HĐH. Nhưng nó đã có tác dụng. Bạn có thấy một tập tin được gọi là /dev/myinternetz/www/google/com/tcp/80bất cứ nơi nào trên hệ thống của bạn ngày hôm nay? Bạn có thể mở () nó, viết () một truy vấn và đọc () câu trả lời bằng HTML hay không? Không? Điều này là do sự trừu tượng "là một tệp" này không thuận tiện cho việc tương tác trên mạng. Nó sẽ không hoạt động quá tốt trong thực tế. Luật trừu tượng bị rò rỉ trong hành động.


9
Sự thật thú vị: một số phiên bản của bash sẽ cho phép bạn mở /dev/tcp/www.google.com/80. Đây không phải là một tập tin thực tế - bash chỉ là giả mạo nó.
dùng253751

2
@immibs: Thêm điểm nữa, có thể hợp lý để tạo ra một hệ thống tập tin thực sự thực hiện điều đó.
Joshua

Tôi cho rằng bạn có thể đọc /dev/memhoặc /dev/kmemnếu bạn muốn.
Jason C

4
Lưu ý rằng gói 9 thực hiện điều này hơn nữa và thực sự, các giao thức mạng được xử lý thông qua hệ thống tệp giả cho hiệu ứng của ví dụ / dev / myiNETz / www / google / com / tcp / 80 của bạn (tất nhiên với một đường dẫn khác). Ngoài ra, ram vật lý thực sự hoạt động rất giống một tệp, bạn mmap ram vào không gian địa chỉ ảo của bạn giống như bạn mmap một tệp vào đó. (malloc được thực hiện theo ý tưởng này).
Vality

1
Kế hoạch 9 đưa "mọi thứ là một tập tin" đến cùng với "mọi thứ đều trong suốt mạng" có một số hàm ý khá mạnh mẽ. Ví dụ, không cần NAT, bạn chỉ cần gắn ngăn xếp TCP / IP của bộ định tuyến (chỉ là tệp trong suốt mạng (hệ thống)) trên máy cục bộ của bạn và gửi các gói trực tiếp từ bộ định tuyến của bạn.
Jörg W Mittag

7

Ổ cắm là tập tin. Bạn có thể sử dụng readwritetrên một ổ cắm: chúng tương đương với gọi recvsendvới flags=0. Bạn đóng chúng lại với close. Bạn có thể di chuyển chúng xung quanh với dupvà bạn bè nếu bạn cần xáo trộn mô tả tệp. Bạn có thể đặt một số cờ với fcntlvà sử dụng bộ đệm stdio sau khi gọi fdopen. Danh sách cứ kéo dài. Rất quan trọng, bạn có thể gọi selectpolltrên bất kỳ loại tệp nào, bao gồm cả ổ cắm, vì vậy các chức năng này cho phép chương trình chặn cho đến khi nhận được đầu vào thông qua bất kỳ phương tiện nào chỉ bằng cách liệt kê mô tả tệp.

Có thêm hệ thống các cuộc gọi cho một số loại ổ cắm ( recvsend, shutdownvv), giống như có một hệ thống gọi thêm cho các thiết bị ( ioctl).

Không phải tất cả các tệp đều có tên và trong số đó, chúng không luôn tồn tại trong cấu trúc thư mục. Các đường ống được tạo bởi pipe(ví dụ trong đường ống vỏ) và các ổ cắm được tạo bởi socketpairkhông có tên, nhưng chúng vẫn là các tệp. Các socket được tạo bởi socketcó một tên có cú pháp phụ thuộc vào tên miền. Tên này sẽ được thông qua trong một struct sockaddrđến bindvà các chức năng khác. Đối với AF_UNIXổ cắm Unix ( ), tên là a struct sockaddr_un, là họ và chuỗi; tùy thuộc vào chuỗi, đây có thể là tên tệp (ổ cắm có tên có thể được tạo bằng mknodnhiều biến thể unix) hoặc không (không gian tên trừu tượng). Đối với AF_INETổ cắm IPv4 ( ), tên là a struct sockaddr_in, chứa số cổng và địa chỉ IP, cộng với protocoltừ socketcuộc gọi.


7

Nếu bạn statlà một socket, bạn sẽ thấy rằng nó có số inode và các đặc điểm khác của các tệp thông thường, vì vậy tôi sẽ phân loại nó thành một tệp trên hệ thống tệp. Thí dụ:

# file live
live: socket
# stat live
File: `live'
  Size: 0               Blocks: 0          IO Block: 4096   socket
Device: fc03h/64515d    Inode: 198817      Links: 1
Access: (0660/srw-rw----)  Uid: (23129/  icinga)   Gid: (23130/icinga-cmd)
Access: 2014-11-07 09:27:59.000000000 -0800
Modify: 2014-11-05 09:27:03.000000000 -0800
Change: 2014-11-05 09:27:03.000000000 -0800

17/11. Thông tin bổ sung cho Linux (ext3): Ổ cắm có inode (là khối 256 byte trên đĩa) nhưng không có bất kỳ khối dữ liệu nào (bạn có thể xác minh điều này bằng cách trích xuất inode và kiểm tra các con trỏ khối dữ liệu; hoặc bằng cách đang chạy debugfs 'stat' hiển thị Blockcount bằng 0). Vì vậy, nó có siêu dữ liệu tệp (chủ sở hữu, nhóm, quyền, v.v.) nhưng không có nội dung dữ liệu trên đĩa. Đây là giống hệt với một tập tin trống thông thường ( touch /tmp/foo) cũng có số lượng bằng 0. Trong trường hợp đầu tiên, trường "loại" trong nút hiển thị "ổ cắm"; trong trường hợp thứ hai, nó hiển thị "tập tin thông thường."

Tài liệu tham khảo: cấu trúc inode ext2 ; stat, dumpe2fsdebugfscác lệnh.


1
Tôi muốn nói chỉ cần có một cái gì đó để chạy filehoặc statlàm cho nó trở thành một tập tin.
Kevin
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.