1.獲取消息隊列
消息隊列相關的API都在sys/msg.h庫中,要創建消息隊列,使用函數msgget();這個函數第一個參數爲消息隊列ID(此Id是給定主機上唯一的描述符或關鍵字),第二個參數爲識別消息旗標的參數,返回值是一個句柄,和文件描述符相似,指向指定Id的消息隊列。
int msgget(key_t key, int msgflg);key_t值必須是一個非零的值或者是特殊符號IPC_PRIVATE。
msgflg允許用戶設置兩個不同類型的參數:一個指令和一個訪問權限設置選項。權限和文件權限類似。指令有三種:
1)IPC_CREAT
2)IPC_CREAT|IPC_EXCL
3)0:告訴msgget消息隊列已存在,獲取消息隊列描述符
key=ftok("/home/queue",0); //保證消息隊列id唯一
msgid=msgget(key,IPC_CREAT|0666);
2.配置消息隊列
消息大小默認是16kB,可以採用msgctl()函數調整其大小。eg:
struct msqid_ds buf;
msgid=msgget(xxx,0);
msgctl(msgid,XXX,&buf);
msgctl()函數的第二個參數有三種值可以設置:
1)IPC_STAT:讀取消息隊列當前默認設置
2)IPC_SET :修改消息隊列設置
3)IPC_RMID:移除指定的消息隊列
注:msgctl()函數可以獲取消息隊列信息、設置消息隊列信息和移除消息隊列
3.向消息隊列寫入消息
消息通過消息隊列發送,消息隊列上下文環境對消息只有一個限制,即要發送的消息對象必須在它的開頭有一個long類型的變量,用於定義消息的類型。通過msgsnd()函數來向消息隊列寫消息。
4.從消息隊列讀取消息
首先通過msgget()函數獲取消息隊列Id,然後通過msgrcv()函數從消息隊列讀取消息。
5.移除消息隊列
使用msgctl()函數和參數IPC_RMID來移除。
msgid=msgget(xxx,0);
msgctl(msgid,IPC_RMID,NULL);