實際上,訊息佇列常常儲存在鍊錶結構中。擁有許可權的程序可以向訊息佇列中寫入或讀取訊息。
訊息佇列本身是非同步的,它允許接收者在訊息傳送很長時間後再取回訊息,這和大多數通訊協議是不同的。例如www中使用的http協議是同步的,因為客戶端在發出請求後必須等待伺服器回應。然而,很多情況下我們需要非同步的通訊協議。比如,乙個程序通知另乙個程序發生了乙個事件,但不需要等待回應。但訊息佇列的非同步特點,也造成了乙個缺點,就是接收者必須輪詢訊息佇列,才能收到最近的訊息。
和訊號相比,訊息佇列能夠傳遞更多的資訊。與管道相比,訊息佇列提供了有格式的資料,這可以減少開發人員的工作量。但訊息佇列仍然有大小限制。
包含檔案
1、msg.c
2、msg.h
3、thread.c
原始檔1 msg.c
#include #include #include #include #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 )
dbg("msg queue id:%d\n",qid);
return qid;}/*
殺死訊息佇列
qid:訊息佇列id
*/int msg_kill(int qid)
原始檔2 msg.h
#ifndef _m_msg_h_
#define _m_msg_h_
/*訊息佇列鍵值*/
#define msg_key 0x12345
/*訊息型別定義
通過訊息型別接收特定組的訊息
而不是訊息佇列上的所以訊息都接收
*/enum ; /*
用於傳送接收的訊息buf
*/typedef struct _msg_bufmsg_buf;
int msg_init(int msgkey);
int msg_kill(int qid);
#endif
/*
訊息佇列示例,一般來說,訊息對用術語ipc中的一種,
既然能用用於多程序通訊,當然也可以用在單程序中的多執行緒中,
而且,當成語複雜度提公升後,多執行緒中使用訊息佇列也非常的方便
*/#include #include #include #include #include #include #include "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)
static int isthreadquit = 0;
int gqid;//訊息佇列id
int gmyprocid = msg_type_msg1;
/*某裝置寫操作,不同同時訪問,所以所以需要執行緒鎖保護
1、將函式devicewrite中加鎖
2、在訪問devicewrite的執行緒中加鎖
以上兩種方法跟據需要選擇其一。
本例中在訪問的執行緒中加鎖
*/void devicewrite(char *str)
void setxxthreadquit()
void *xxmanagethread(void *arg)
/*arg是將指標帶進來,cmd則相反,或者設定 null*/
pthread_exit(cmd);
//pthread_exit(null);
}void *xxmanagethreadmutex(void *arg)
dbg("msgrcv cmd = %d\n",msg.cmd);
sleep(1);
}/*arg是將指標帶進來,cmd則相反,或者設定 null*/
pthread_exit(cmd);
//pthread_exit(null);
}int xxmanagethreadinit()
ret = pthread_create(&tmanagethreadmutex,null,xxmanagethreadmutex,"2 thread");
if(ret == -1)
/*設定執行緒退出時資源的清理方式,如果是detach,退出時會自動清理
如果是join,則要等待pthread_join呼叫時才會清理
*/ pthread_detach(tmanagethread);
pthread_detach(tmanagethreadmutex);
//pthread_join(tmanagethread,retn);
//dbg("retn value=%s\n",retn);
return 0;
}#define test_main
#ifdef test_main
int main()
while(count--)
setxxthreadquit();
/*等待執行緒結束*/
sleep(1);
/*清理訊息佇列*/
msg_kill(gqid);
dbg("waitting thread exit...\n");
return 0;
}#endif
執行結果:
[root@localhost src]# ./a.out
hello liuyu
create msg queue id:65536
msg queue id:65536
[0] main running
arg value=1 thread
msgsnd cmd = 0
arg value=2 thread
msgrcv cmd = 0
msgsnd cmd = 1
msgrcv cmd = 1
[0] main running
msgsnd cmd = 2
msgrcv cmd = 2
msgsnd cmd = 3
msgrcv cmd = 3
[0] main running
msgsnd cmd = 4
msgrcv cmd = 4
msgsnd cmd = 5
msgrcv cmd = 5
kill queue id:65536
waitting thread exit...
Linux 訊息佇列程式設計
訊息佇列 訊號量以及共享記憶體被稱作 xsi ipc,它們均來自system v的ipc功能,因此具有許多共性。鍵和識別符號 核心中的每一種ipc結構 比如訊號量 訊息佇列 共享記憶體 都用乙個非負整數的識別符號加以標示 如共享記憶體的shmid 訊號量的semid 以及訊息佇列的msgid 不同於...
linux訊息佇列 Linux訊息佇列
訊息佇列,unix的通訊機制之一,可以理解為是乙個存放訊息 資料 容器。將訊息寫入訊息佇列,然後再從訊息佇列中取訊息,一般來說是先進先出的順序。可以解決兩個程序的讀寫速度不同 處理資料速度不同 系統耦合等問題,而且訊息佇列裡的訊息哪怕程序崩潰了也不會消失。最簡單的訊息記憶體的使用流程 ftok函式生...
linux程式設計 程序通訊 訊息佇列
訊息佇列是訊息的鏈式佇列 1 建立訊息佇列 include include include int msgget key t key,int msg 2 訊息佇列屬性控制 int msgctl int msqid,int cmd,struct msqid ds buf 3 傳送資訊到訊息佇列 int...