ổ cắm miền unix VS đường ống được đặt tên?


122

Sau khi nhìn vào một ổ cắm có tên unix và tôi nghĩ rằng chúng được đặt tên là đường ống. Tôi nhìn vào các bảng tên và không thấy có nhiều sự khác biệt. Tôi thấy chúng được khởi tạo khác nhau nhưng đó là điều duy nhất tôi nhận thấy. Cả hai đều sử dụng chức năng ghi / đọc C và hoạt động như nhau AFAIK.

Sự khác biệt giữa ổ cắm tên miền unix và đường ống có tên là gì? Khi nào tôi sẽ chọn cái này trên cái kia? Tôi nên sử dụng cái nào theo mặc định (như cách tôi sử dụng vector theo mặc định trong C ++ thay vì sử dụng deque, list hoặc bất cứ thứ gì khác nếu tôi có nhu cầu)?

c  linux 

1
@GregHewgill: tiếc là câu hỏi đó thiên về "IPC là gì" hơn là sự khác biệt mà tôi đang hỏi: /. Tôi đã thấy rằng trước khi đăng, tôi có nên liên kết và nói rằng nó có liên quan không? (nó wasnt hữu ích cho tôi)

1
@acid: Vâng, liên kết các câu hỏi liên quan và giải thích câu hỏi bạn còn thắc mắc luôn là một ý kiến ​​hay.
Ben Voigt

3
Bài viết này đã tóm tắt nó khá nhiều. Giải mã các ổ cắm tên miền Unix: thomasstover.com/uds.html
Cong Ma

Liên kết bị hỏng: techdeviancy.com/uds.html
mcdado

Câu trả lời:


106

Các ổ cắm miền UNIX nói chung linh hoạt hơn các ống có tên. Một số lợi thế của chúng là:

  • Bạn có thể sử dụng chúng cho nhiều hơn hai quy trình đang giao tiếp (ví dụ: một quy trình máy chủ với nhiều quy trình khách có khả năng kết nối);
  • Chúng là hai chiều;
  • Chúng hỗ trợ chuyển thông tin xác thực UID / GID đã được hạt nhân xác minh giữa các quy trình;
  • Chúng hỗ trợ chuyển các bộ mô tả tệp giữa các quy trình;
  • Chúng hỗ trợ các chế độ gói tin và gói tuần tự.

Để sử dụng nhiều tính năng này, bạn cần sử dụng send()/ recv()họ lệnh gọi hệ thống thay vì write()/ read().


11
Mặt khác, có lẽ nên nói rằng các đường ống tên có lợi thế là chúng có thể được "kết nối với" thông qua các open(2)cuộc gọi thông thường , điều này làm cho chúng phù hợp hơn để xây dựng các đường ống đặc biệt giữa các chương trình thường chỉ lấy các đối số tên tệp.
Dolda2000

66

Một điểm khác biệt là các đường ống được đặt tên là một chiều, vì vậy bạn sẽ cần sử dụng hai trong số chúng để thực hiện giao tiếp hai chiều. Ổ cắm tất nhiên là hai chiều. Có vẻ phức tạp hơn một chút khi sử dụng hai biến thay vì một (nghĩa là hai đường ống thay vì một ổ cắm).

Ngoài ra, bài báo wikipedia khá rõ ràng về điểm sau : "Các ổ cắm miền Unix có thể được tạo dưới dạng các luồng byte hoặc dưới dạng chuỗi datagram, trong khi các đường ống chỉ là luồng byte."


Trên thực tế, các đường ống được đặt tên là hai hướng nhưng bán song công . Điều này có nghĩa là giao tiếp có thể đi từ đầu A đến đầu B, hoặc B đến A, nhưng không bao giờ cả hai cùng một lúc.


1
hmm thú vị +1. Bạn có tình cờ biết sự khác biệt giữa bytestream và datagram là gì không? Có thể ví dụ trong một hoặc hai tình cảm như bạn đã làm cho câu hỏi này?

7
@acidzombie: Một đường ống hoặc ổ cắm ở chế độ dữ liệu duy trì các ranh giới, để một writelệnh gọi tạo ra một readlệnh gọi. Trong chế độ luồng, dữ liệu có thể được nối với nhau trong một luồng dài, vì vậy có thể đọc nhiều lần ghi cùng một lúc hoặc ngược lại. (Windows có datagram Ống, theo câu trả lời jtoberon của Unix không)
Ben Voigt

1
@BenVoigt tốt, việc phân phối gói dữ liệu socket datagram là không đáng tin cậy, vì vậy việc ghi sẽ không nhất thiết tạo ra lệnh gọi đọc. Có lẽ đối với các ổ cắm cục bộ, nhưng điều đó không rõ ràng từ nhận xét của bạn. Vì vậy, bất kể nó có vấn đề.
xaxxon

3
@xaxxon: Cả hai đường ống và ổ cắm miền unix đều là cục bộ, vì vậy không mất dữ liệu là bộ nhận đang làm trống hàng đợi của nó.
Ben Voigt

6
Có, không giống như UDP, các ổ cắm miền datagram Unix được đảm bảo , phân phối theo đơn đặt hàng.
jtchitty
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.