實際上,消息隊列常常保存在鏈表結構中。擁有權限的進程可以向消息隊列中寫入或讀取消息。
消息隊列本身是異步的,它允許接收者在消息發送很長時間後再取回消息,這和大多數通信協議是不同的。例如WWW中使用的HTTP協議是同步的,因為客戶端在發出請求後必須等待服務器回應。然而,很多情況下我們需要異步的通信協議。比如,一個進程通知另一個進程發生了一個事件,但不需要等待回應。但消息隊列的異步特點,也造成了一個缺點,就是接收者必須輪詢消息隊列,才能收到最近的消息。
和信號相比,消息隊列能夠傳遞更多的信息。與管道相比,消息隊列提供了有格式的數據,這可以減少開發人員的工作量。但消息隊列仍然有大小限制。
包含文件
1、msg.c
2、msg.h
3、thread.c
源文件1 msg.c
- #include <stdio.h>
- #include <stdlib.h>
- #include <unistd.h>
- #include <sys/msg.h>
-
- #define __DEBUG
- #ifdef __DEBUG
- #define DBG(fmt,args...) fprintf(stdout, fmt, ##args)
- #else
- #define DBG(fmt,args...)
- #endif
- #define ERR(fmt,args...) fprintf(stderr, fmt, ##args)
-
- /*
- 消息隊列初始化
- msgKey:消息隊列鍵值
- qid:返回值,消息隊列id
- */
- int Msg_Init( int msgKey )
- {
- int qid;
- key_t key = msgKey;
- /*
- 消息隊列並非私有,因此此鍵值的消息隊列很可能在其他進程已經被創建
- 所以這裡嘗試打開已經被創建的消息隊列
- */
- qid = msgget(key,0);
- if(qid < 0){
- /*
- 打開不成功,表明未被創建
- 現在可以按照標准方式創建消息隊列
- */
- qid = msgget(key,IPC_CREAT|0666);
- DBG("Create msg queue id:%d\n",qid);
- }
- DBG("msg queue id:%d\n",qid);
- return qid;
- }
- /*
- 殺死消息隊列
- qid:消息隊列id
- */
- int Msg_Kill(int qid)
- {
- msgctl(qid, IPC_RMID, NULL);
- DBG("Kill queue id:%d\n",qid);
- return 0;
- }