2010-08-17 34 views

Trả lời

18

Off đỉnh đầu của tôi và giả sử bạn nói về hàng đợi tin nhắn POSIX (không phải là những SysV):

  • Ống không giới hạn về kích thước, hàng đợi tin nhắn là.
  • Ống có thể được tích hợp trong hệ thống bằng cách sử dụng bộ mô tả tập tin, hàng đợi tin nhắn có bộ chức năng riêng, mặc dù linux hỗ trợ select(), poll(), epoll() và bạn bè trên mqd_t.
  • Ống, khi đã đóng, yêu cầu một số lượng hợp tác trên cả hai mặt để thiết lập lại chúng, hàng đợi thông báo có thể được đóng và mở lại ở hai bên mà không có sự cộng tác của phía bên kia.
  • Đường ống bằng phẳng, giống như một luồng, để áp đặt cấu trúc thông báo bạn sẽ phải triển khai giao thức ở cả hai bên, hàng đợi tin nhắn được định hướng thư, không cần quan tâm đến thông điệp thứ năm hàng đợi.
+0

ok, cảm ơn rất nhiều ... Nhưng tôi có một chút nghi ngờ "đường ống khi đóng cửa yêu cầu một số loại hỗ trợ trên cả hai mặt", bạn có nghĩa là để làm nổi bật điểm mà ống không phải là hạt nhân dai dẳng và tin nhắn queus là .. Và chính xác loại cần thiết nào được yêu cầu để reesatblish ống một khi đóng cửa? – mint9

+0

@ mint9: nói chung bạn cần phải nắm bắt SIGPIPE, xử lý nó một cách duyên dáng, sau đó 'mở lại' ống. Tôi tưởng tượng bạn có thể fork() quá trình của bạn (trên cả hai mặt), dup stdin/stdout của bạn, giữ cho cha mẹ chạy (họ hành động như bảo vệ), sau đó khi bạn đóng cửa cho phép con bạn chết (trên cả hai mặt) và làm lại ngã ba/thủ tục dup/pipe. – hroptatyr

+0

okie, tôi hiểu rồi. Cảm ơn – mint9

9

Chúng thực sự rất khác nhau.

Sự khác biệt thực tế lớn nhất là đường ống không có khái niệm "thông điệp", nó chỉ là một đường ống đến write() byte đến và read() byte từ. Đầu nhận phải có cách để biết phần dữ liệu nào cấu thành "thông điệp" trong chương trình của bạn, và bạn phải tự mình thực hiện. Hơn nữa thứ tự byte được định nghĩa: byte sẽ xuất hiện theo thứ tự bạn đặt vào. Và nói chung, nó có một đầu vào và một đầu ra.

Hàng đợi thư được sử dụng để chuyển "thư" có loại và kích thước. Vì vậy, kết thúc nhận được chỉ có thể chờ đợi cho một "tin nhắn" với một loại nhất định, và bạn không phải lo lắng nếu điều này là hoàn thành hay không. Một số quy trình có thể gửi và nhận từ cùng một hàng đợi.

xem man mq_overview và/hoặc man svipc để biết thêm thông tin.

+1

ngay cả trong hàng đợi, bạn có thể gửi bất kỳ cấu trúc nào như thông báo vì vậy trong trường hợp này, đầu nhận phải biết "phần dữ liệu cấu thành thông báo trong chương trình của bạn. –

Các vấn đề liên quan