天天看點

Linux IPC實踐(4) --System V消息隊列(1)

   消息隊列提供了一個從一個程序向另外一個程序發送一塊資料的方法(僅局限于本機);

   每個資料塊都被認為是有一個類型,接收者程序接收的資料塊可以有不同的類型值.

   消息隊列也有管道一樣的不足: (1)每個消息的最長位元組數的上限(MSGMAX); (2)系統中消息隊列的總條數也有一個上限(MSGMNI); (3)每個消息隊列所能夠儲存的總位元組數是有上限的(MSGMNB) .

檢視系統限制

   cat /proc/sys/kernel/msgmax  #最大消息長度限制

   cat /proc/sys/kernel/msgmnb  #消息隊列總的位元組數

   cat /proc/sys/kernel/msgmni  #消息條目數

Linux IPC實踐(4) --System V消息隊列(1)

管道 vs. 消息隊列

管道

消息

流管道

有邊界

先進先出

可以後進先出

消息隊列在核心中的表示

Linux IPC實踐(4) --System V消息隊列(1)

消息在消息隊列中是以連結清單形式儲存的, 每個節點的類型類似如下:

msgget

功能:用來建立和通路一個消息隊列

參數:

  key: 某個消息隊列的名字

  msgflg:由九個權限标志構成,如0644,它們的用法和建立檔案時使用的mode模式标志是一樣的(但是消息隊列沒有x(執行)權限)

傳回值:

  成功傳回消息隊列編号,即該消息隊列的辨別碼;失敗傳回-1

msgget調用關系圖

Linux IPC實踐(4) --System V消息隊列(1)
Linux IPC實踐(4) --System V消息隊列(1)

msgctl函數

功能:擷取/設定消息隊列的資訊

   msqid: 由msgget函數傳回的消息隊列辨別碼

   cmd:是将要采取的動作(見下)

cmd:将要采取的動作(有三個可取值),分别如下:

Linux IPC實踐(4) --System V消息隊列(1)

附-檢視系統中的IPC對象

     ipcs

   删除消息隊列

     ipcrm -q [msqid]

  或  ipcrm -Q [key] #如果key不等于0的話

繼續閱讀