#Linux#進程間通信# 消息隊列(message queue)

消息隊列實際上是操作系統在內核爲我們創建的一個隊列,通過這個隊列的標識符key,每一個進程都可以打開這個隊列,每個進程都可以通過這個隊列向這個隊列中插入一個結點或者獲取一個結點來完成不同進程間的通信。用戶組織一個帶有類型的數據塊,添加到隊列中,其他的進程從隊列中獲取數據塊,即消息隊列發送的是一個帶有類型的數據塊;消息隊列是一個全雙工通信,可讀可寫(可以發送數據,也可以接受數據)。消息隊列生命週期隨內核,如果沒有釋放消息隊列或者沒有關閉操作系統,消息隊列會一直存在。

消息隊列提供了一種從一個進程向另一個進程發送一個數據塊的方法。  每個數據塊都被認爲含有一個類型,接收進程可以獨立地接收含有不同類型的數據結構。我們可以通過發送消息來避免命名管道的同步和阻塞問題。但是消息隊列與命名管道一樣,每個數據塊都有一個最大長度的限制Linux用宏MSGMAX和MSGMNB來限制一條消息的最大長度和一個隊列的最大長度(System V標準)。

消息隊列和之前討論過的匿名管道,命名管道有較大的區別,主要有以下兩點:

  • 一個進程向消息隊列寫入消息之前,並不需要某個進程在該隊列上等待該消息的到達,而管道和FIFO是相反的,進程向對方寫消息時,匿名管道和命名管道必需已經打開來讀。 
  • IPC的持續性不同。匿名管道和命名管道是隨進程的持續性,當匿名管道和命名管道最後一次關閉發生時,仍在匿名管道和命名管道中的數據會被丟棄。消息隊列是隨內核的持續性,即一個進程向消息隊列寫入消息後,然後終止,另外一個進程可以在以後某個時刻打開該隊列讀取消息。只要內核沒有重新自啓,消息隊列沒有被刪除。即匿名管道和命名管道是同步的,消除隊列是異步的。

消息隊列中的每條消息通常具有以下屬性:

  • 一個表示優先級的整數;
  • 消息的數據部分的長度;
  •  消息數據本身;

消息隊列在內核中的表示

 

消息隊列(message queue)同樣分System V標準與POSIX 標準,詳細參考

#Linux#進程間通信# System V標準&POSIX標準

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章