消息隊列由消息隊列id來唯一標識
?
消息隊列就是一個消息的列表 用戶可以在消息隊列中添加消息 讀取消息
?
消息隊列可以按照類型來發送和接收消息
?
?????????????????????????????????????????????????? 消息隊列使用步驟
?
打開/創建消息隊列 msgget
?
向消息隊列發送消息 msgsnd
?
從消息隊列接收消息 msgrcv
?
控制消息隊列 msgctl
?
??????????????????????????????????????? 創建/打開消息隊列
?
#include <sys/ipc.h>
#include <sys/msg.h>n
int msgget(key_t key, int msgflg)
?
成功返回消息隊列的id 失敗返回EOF
key 和消息隊列關聯的key IPC_PRIVATE(私有的)或ftok(如果想共享這個消息隊列 通過這個函數創建key)
msgflg 標志位 IPC_CREAT|0666
??????????????????????????????????????????? 消息發送
?
#include <sys/ipc.h>
#include <sys/msg.h>
int msgsnd(int msgid, const void *msgp, size_t size,int msgflg)
?
成功返回0 失敗返回-1
msgid 消息隊列id
msgp 消息緩沖區地址
size 消息正文長度
msgflg 標志位 0(阻塞, 直到空間足夠 發送成功,,函數返回0)或IPC_NOWAIT(不會阻塞, 讓函數-1 )
?
???????????????????????????????????? 消息格式
?
通信雙方首先定義好統一的消息格式
?
用戶根據應用需求定義結構體類型
?
首成員類型為long, 代表消息類型(正整數)
?
其他成員都屬于消息正文
???????????????????????????????????? 消息接收
?
#include <sys/ipc.h>
#include <sys/msg.h>
int msgrcv(int msgid, void *msgp, size_t size, long msgtype, int msgflg)
?
成功返回消息隊列長度 失敗返回-1
msgid 消息隊列id
msgp 消息隊列緩沖區地址
size 指定接收的消息長度
msgtype 指定接收的消息類型 如果為0 表示接收消息隊列中最早的消息
如果為負數 是按照優先級接收
msgflg 標志位 0(如果無消息 ,阻塞 直到有消息 或信號打斷 或消息隊列被刪除)或IPC_NOWAIT
(如果沒有消息 返回一個錯誤)
????????????????????????????????????? 控制消息隊列
?
#include <sys/ipc.h>
#include <sys/msg.h>
int msgctl(int msgid, int cmd, struct msqid_ds *buf)
成功返回 0 失敗返回-1
msgid 消息隊列id
cmd 要執行的操作
IPC_STAT :獲取消息隊列的屬性
IPC_SET :設置消息隊列的屬性
IPC_RMID 刪除消息隊列的屬性(不需要第三個參數, 執行這個后 立馬執行
不論有沒有消息在發送或接受
buf 存放消息隊列屬性的地址