linux下消息隊列(Message queue)

1.消息隊列
消息隊列(英語:Message queue)是一種進程間通信或同一進程的不同線程間的通信方式。
就是一個消息的鏈表,可以把一條消息看做一個記錄,用戶可以從中讀取讀取消息或者向其中添加消息。
消息隊列提供了一種從一個進程向另一個進程發送一個數據塊的方法。消息隊列存在於內核中,由“隊列ID”來進行標識。
消息隊列的實現包括創建,添加信息,讀取信息和控制信息隊列。
2.msgget函數
該函數作用是創建和訪問一個消息隊列:
#include <sys/types.h>
#inlcude <sys/types.h>
#include <sys/msg.h>
int msgget(key_t key,int msgflag);
key鍵值,用來命名某個特定的消息隊列。同樣和信號量和信號一樣,IPC_PRIVATE值可以創建只有當前進程可以訪問的消息隊列。
msgflag由9個權限標誌組成。
若成功,則msgget函數返回一個正整數,即隊列標示符。
3.msgsnd函數
msgsnd函數用來把消息添加到消息隊列中:
int msgsnd(int msqid,const void *msgp,size_t msgsz,int msgflg);
消息的結構受到兩個方面的約束:首先他的長度必須小於系統規定的上限;其次,它必須是以一個長整形成員變量開始,接收函數用這個成員變量來確定消息的類型。使用消息時應該定義成:
struct my_message
{
long int message_type;
/*需要傳輸的數據*/
}
參數msqid是megget函數的返回的消息隊列的標識符。
msgp是一個指向準備發送的消息的指針。
msgsz是消息的長度,這個長度不包括消息類型成員變量。
msgflag控制在當前消息隊列滿或者達到系統範圍限制時要發生的事情。
如果msgflg中設置IPC_NOWAIT標誌,函數將立刻返回,不發送消息並且返回值-1.
若設定的啊標識是0,則msgsnd函數會一直阻塞直到發送成功爲止。
函數執行成功返回0,失敗返回-1.
4.msgrcv函數:
msgrcv函數從一個消息隊列中獲取消息:
ssize_t msgrcv(int msqid,void *msgp,size_t msgsz,long msgtyp,inr msgflg);
msqid是由msgget函數返回的消息隊列標識符。
msgp是一個指向準備接受的消息的指針。
msgsz是消息的長度。
msgtyp可以實現一種簡單形式的接收優先級。
(1) 當msgtyp=0,就獲取消息隊列中的第一個可用的消息。
(2)如果值大於0,就獲取具有與msgtyp相同消息類型的第一個消息
(3)如果值小於0,就獲得消息隊列中第一個小於或等於msgtyp且絕對值類型值最小的消息
msgflg用於控制當隊列中沒有相應的類型的消息可接收時,將發生的事。
(1)MSG_NOERROR:當返回的消息比要獲得的長度長,就會截斷
(2)IPC_NOWAIT:若在消息隊列中已經沒有相應的類型可以被接收,則函數會立即返回。
(3)0:msgsnd函數阻塞直到接收到消息
若msgrcv函數執行成功,返回放到接收緩衝區中的字節數,消息被複制到由msgp指向的用戶分配的緩衝區,然後刪除消息隊列中對應的消息。
5.msgctl函數
msgctl與共享內存的控制函數類似:
int msgctl(int msqid ,int cmd,struct msqid_ds *buf);
cmd可用取三個值:
(1)IPC_STAT:讀取消息隊列的數據結構msqid_ds,存儲在buf指定的區域
(2)IPC_SET:如果進程有足夠的權限,就把消息隊列的當前關聯值設置爲msqid_ds結構中給出的值。
(3)IPC_RMID:刪除消息隊列
注意:當刪除消息隊列時,某個進程正在msgsnd或msgrcv函數中等待,則這兩個函數都將會失敗。
發佈了60 篇原創文章 · 獲贊 6 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章