2010-08-17 74 views

回答

18

了我的頭頂部,假設你談POSIX消息隊列(不SysV的那些):

  • 管不得有大小限制,消息隊列。
  • 管道可以集成在使用文件描述符的系統中,消息隊列有自己的一套功能,儘管linux支持select(),poll(),epoll()mqd_t上的朋友。
  • 管道一旦關閉,需要雙方進行一定程度的合作才能重新建立,消息隊列可以關閉並在任何一方重新打開,而不需要另一端的合作。
  • 管道是扁平的,很像流,強加一個消息結構,你將不得不在雙方都實現一個協議,消息隊列已經是消息導向了,不必在意第五條消息隊列。
+0

好的,非常感謝... 但是我有一個小小的懷疑「管道一旦關閉需要雙方支持某種支持」,你的意思是強調管道不是內核持久化和消息隊列是.. 。 究竟需要什麼樣的套管來重新封閉管道一旦關閉? – mint9 2010-08-17 11:15:37

+0

@ mint9:一般來說,您需要抓住SIGPIPE,優雅地處理它,然後'重新打開'管道。我想你可以fork()你的進程(雙方),重複你的標準輸入/輸出,讓父母繼續運行(他們充當守衛),然後當你關閉你讓你的孩子死(兩邊),並重做叉/ dup/pipe程序。 – hroptatyr 2010-08-17 11:39:58

+0

okie,我明白了。 謝謝 – mint9 2010-08-18 06:49:44

9

他們是非常不同的東西,真的。

最大的實際區別是管道沒有「消息」的概念,它只是一個從write()字節到read()字節的管道。接收端必須能夠知道程序中哪些數據構成了「消息」,並且您必須自己實現這一點。此外,還定義了字節順序:字節將按照您輸入的順序出現。一般而言,它具有一個輸入和一個輸出。

消息隊列用於傳輸具有類型和大小的「消息」。因此,接收端可以等待一個特定類型的「消息」,並且您不必擔心這是否完成。多個進程可能發送到同一隊列並從中接收。

參見man mq_overview和/或man svipc瞭解更多信息。

+1

即使在隊列中,您也可以發送任何結構作爲消息,因此在這種情況下,接收端也必須知道「在您的程序中哪些數據構成了消息。 – 2012-06-25 18:01:03