Linux 程序間通訊之訊息佇列(IPC資源)

2021-09-09 01:37:24 字數 2944 閱讀 7992

訊息佇列提供的服務就是乙個程序向乙個程序傳送有型別資料塊。

訊息佇列提供了⼀個從⼀個程序向另外⼀個程序傳送⼀塊資料的⽅法每個資料塊都被認為是有⼀個型別,接收者程序接收的資料塊可以有不同的型別值訊息佇列也有管道⼀樣的不⾜,就是每個訊息的最⼤⻓度是有上限的(msgmax),每個訊息佇列的總的位元組數是有上限的(msgmnb),系統上訊息佇列的總數也有⼀個上限(msgmni)。

訊息佇列的生命週期也是隨核心的。它支援雙向通訊,但是a程序和b程序都可以向訊息佇列傳送資料塊,也都可以拿取資料塊,那麼萬一a程序拿的還是a程序的資料塊,b程序拿的還是b程序的資料塊不就沒有完成程序間通訊了嗎?因此傳送的必須是有型別的資料塊,來確保程序間的通訊。

ipcs -q 檢視訊息佇列相關資訊

ipcrm -q id號 刪除id號訊息佇列

訊息佇列相關函式

msgget函式

功能:⽤來建立和訪問⼀個訊息佇列

原型

int

msgget

(key_t key,

int msg***)

;

引數key: 某個訊息佇列的名字

msg***:由九個許可權標誌構成,它們的⽤法和建立⽂件時使⽤的mode模式標誌是⼀樣的

返回值:成功返回⼀個⾮負整數,即該訊息佇列的標識碼;失敗返回-1

msgctl函式

功能:訊息佇列的控制函式

原型

int

msgctl

(int msqid,

int cmd,

struct msqid_ds *buf)

;

引數msqid: 由msgget函式返回的訊息佇列標識碼

cmd:是將要採取的動作,(有三個可取值)

返回值:成功返回0,失敗返回-1

msgsnd函式

功能:把⼀條訊息新增到訊息佇列中

原型

int

msgsnd

(int msqid,

const

void

*msgp, size_t msgsz,

int msg***)

;

引數msgid: 由msgget函式返回的訊息佇列標識碼

msgp:是⼀個指標,指標指向準備傳送的訊息,

msgsz:是msgp指向的訊息⻓度,這個⻓度不含儲存訊息型別的那個long int⻓整型

msg***:控制著當前訊息佇列滿或到達系統上限時將要發⽣的事情

msg***=ipc_nowait表⽰佇列滿不等待,返回eagain錯誤。

返回值:成功返回0;失敗返回-1

其中,1.訊息結構在兩⽅⾯受到制約:

⾸先,它必須⼩於系統規定的上限值;

其次,它必須以⼀個long int⻓整數開始,接收者函式將利⽤這個⻓整數確定訊息的型別

2.訊息結構參考形式如下:

struct msgbuf
msgrcv函式

功能:是從⼀個訊息佇列接收訊息

原型

ssize_t msgrcv

(int msqid,

void

*msgp, size_t msgsz,

long msgtyp,

int msg***)

;

引數msgid: 由msgget函式返回的訊息佇列標識碼

msgp:是⼀個指標,指標指向準備接收的訊息,

msgsz:是msgp指向的訊息⻓度,這個⻓度不含儲存訊息型別的那個long int⻓整型

msgtype:它可以實現接收優先順序的簡單形式

msg***:控制著佇列中沒有相應型別的訊息可供接收時將要發⽣的事

返回值:成功返回實際放到接收緩衝區⾥去的字元個數,失敗返回-1

其中,msgtype=0返回佇列第⼀條資訊

msgtype>0返回佇列第⼀條型別等於msgtype的訊息 

msgtype<0返回佇列第⼀條型別⼩於等於msgtype絕對值的訊息,並且是滿⾜條件的訊息型別最⼩的訊息

msg***=ipc_nowait,佇列沒有可讀訊息不等待,返回enomsg錯誤。

msg***=msg_noerror,訊息⼤⼩超過msgsz時被截斷

msgtype>0且msg***=msg_except,接收型別不等於msgtype的第⼀條訊息。

linux程序間通訊之訊息佇列

訊息佇列就是乙個訊息的鍊錶。可以把訊息看作乙個記錄,具有特定的格式以及特定的優先順序。對訊息佇列有寫許可權的程序可以向中按照一定的規則新增新訊息 對訊息佇列有讀許可權的程序則可以從訊息佇列中讀走訊息。include include include include include include in...

linux程序間通訊之訊息佇列

訊息佇列 使用訊息佇列的好處 可以給訊息附加特定的訊息型別。訊息佇列用於同一臺計算機的程序間的通訊。include include key t ftok const char pathname,int proj id 該函式根據檔名生成乙個id 系統建立ipc 通訊 訊息佇列 訊號量和共享記憶體 時...

Linux程序間通訊之訊息佇列

實現功能 編寫程式sender,它建立乙個訊息佇列 然後,迴圈等待使用者通過終端輸入一串字元,將這串字元通過訊息佇列傳送給receiver,直到使用者輸入 bye 為止 最後,它向receiver程序傳送訊息 end 並且等待receiver的應答,等到應答訊息後,將接收到的應答資訊顯示在終端螢幕上...