1.訊息佇列
訊息佇列也稱為報文佇列,訊息佇列是隨核心持續的,只有在核心重起或顯示刪除乙個訊息佇列時,該訊息佇列才會真正刪除
系統中記錄訊息佇列的資料結構struct ipc_ids msg_ids位於核心中,系統中所有訊息佇列都可以在結構msg_ids中找到訪問入口
訊息佇列其實就是乙個訊息的鍊錶,每個訊息佇列有乙個佇列頭,稱為struct msg_queue,這個佇列頭描述了訊息佇列的key值,使用者id,組id等資訊,但它存於核心中而結構體struct msqid_ds能夠返回或設定訊息佇列的資訊,這個結構體位於使用者空間中,與msg_queue結構相似
訊息佇列允許乙個或多個程序向它寫入或讀取訊息,訊息佇列是訊息的鍊錶。訊息是按訊息型別訪問,程序必須指定訊息型別來讀取訊息,同樣,當向訊息佇列中寫入訊息時也必須給出訊息的型別,如果讀佇列使用的訊息型別為0,則讀取佇列中的第一條訊息。
核心空間的結構體msg_queue描述了對應key值訊息佇列的情況,而對應於使用者空間的msqid_ds這個結構體,因此,可以操作msgid_ds這個結構體來操作訊息佇列。
當向訊息佇列傳送訊息那麼佇列會增加一條訊息,讀訊息佇列時,訊息佇列會把此訊息刪除掉。
2. 訊息佇列相關的介面函式
3. 訊息佇列例項
例項1:訊息佇列的屬性測試
#include
#include
#include
#include
#include
void msg_stat(int msgid,struct msqid_ds msg_info);//自定義的函式,獲取訊息佇列相關屬性資訊
int main()msg_sbuf;
struct msgmbufmsg_rbuf;
struct msqid_ds msg_ginfo,msg_sinfo;//定義訊息佇列資訊的msqid_ds
char *msgpath="/etc/inittab";
key=ftok(msgpath,'a');//返回ipc物件識別符號
gflags=ipc_creat|ipc_excl;//建立訊息佇列的標誌,如果與key關聯的訊息佇列存在,則errno為eexist
msgid=msgget(key,gflags|0666);//建立訊息佇列並返回訊息佇列識別符號
if(msgid==-1)
//建立訊息佇列中輸出訊息佇列資訊
msg_stat(msgid,msg_ginfo);
sflags=ipc_nowait;//向訊息佇列傳送訊息,如果訊息佇列不能容納傳送的訊息 則立即返回
msg_sbuf.mtype=10;
msg_sbuf.mtext[0]='f';
msg_sbuf.mtext[1]=0;
reval=msgsnd(msgid,&msg_sbuf,sizeof(msg_sbuf.mtext),sflags);
if(reval==-1)
//傳送完訊息後輸出訊息佇列屬性
例項2: 訊息佇列實現雙向通訊
傳送訊息端:
#include
#include
#include
#include
#include
#include
#define sndmsg 1
#define rcvmsg 2
int main()msg_rbuf;
struct msgsbufmsg_sbuf;
//首先返回乙個ipc物件識別符號
key_t key;//定義外來鍵
key=ftok("/etc/inittab",10);
//新建乙個訊息佇列
msqid=msgget(key,ipc_creat|ipc_excl|0666);//0666是許可權,表示擁有者,組使用者,其它使用者具有讀寫許可權,即能夠向訊息佇列傳送訊息(寫訊息)與接收訊息(讀訊息)
if(msqid==-1)
//首先傳送訊息
while(1)
exit(0);
}接收訊息端:
/**接收訊息端
**/#include
#include
#include
#include
#include
#define sndmsg 1
#define rcvmsg 2
int main()msg_rbuf;
//傳送訊息的結構體
struct msgsbufmsg_sbuf;
//先接收後傳送
key_t key;//ipc物件識別符號
key=ftok("/etc/inittab",10);
//得到訊息佇列識別符號
msqid=msgget(key,0);//返回訊息佇列識別符號,訊息佇列已經建立它是乙個隨核心持續
if(msqid==-1)
while(1)
}執行結果:
傳送方:
[root@localhost ~]# ./sndmsg
lucy:hello
peter:hi
lucy:how are you
peter:fine thank you
lucy:
接收方:
[root@localhost ~]# ./rcvmsg
lucy:hello
peter:hi
lucy:how are you
peter:fine thank you
lucy:/**
peter:
對於訊息佇列,要記住以下幾點:
(1) 訊息佇列是隨核心持續的,只有在核心重起時,或者顯示刪除訊息佇列,這個佇列才會消失
(2)訊息佇列是乙個訊息的鍊錶,而msq_queue這個結構體描述了這個佇列的基本資訊,包括這個佇列的key值,使用者id,組id,等資訊,與使用者空間的msqid_ds相對應。
(3)操作訊息佇列,首先要得到這個訊息佇列的訊息佇列識別符號,訊息佇列的訊息是根據型別來傳送與讀取的。
(4)核心中記錄訊息佇列的全域性資料結構struct ipc_ids msg_ids可以訪問到訊息佇列頭的第乙個成員struct kern_ipc_perm,這個結構中有乙個key,能夠與具體的訊息佇列對應起來。這樣,核心就可以控制訊息佇列了。
關於訊息佇列就總結到這了,希望大家一起交流。
參考:結構msg_queue用來描述訊息佇列頭,存在於系統空間:
struct msg_queue ;
結構msqid_ds用來設定或返回訊息佇列的資訊,存在於使用者空間;
struct msqid_ds ;
linux訊息佇列程序通訊
訊息佇列 也叫做報文佇列 是unix系統v版本中3種程序間通訊機制之一。另外兩種是訊號燈和共享記憶體。這些ipc機制使用共同的授權方法。只有通過系統呼叫將標誌符傳遞給核心之後,程序才能訪問這些資源。這種系統ipc物件使用的控制方法和檔案系統非常類似。使用物件的引用標誌符作為資源表中的索引。訊息佇列就...
linux 程序 訊息佇列通訊
1.概述 該demo主要實現linux下程序之間的訊息佇列通訊,相關介面介紹可以參考 2.場景 半雙工 父程序簡單地通過訊息佇列將資料傳送給子程序 3.測試 程序程式設計demo 訊息佇列 ipc相關的命令 ipcs ipcrm 釋放ipc 檢視程序屬性 ulimit a include inclu...
Linux程序通訊 訊息佇列
博文 程式設計步驟 步驟程序1 程序2使用函式 1獲取到key 獲取到key msgget 2使用key建立訊息佇列拿到訊息id 使用key獲取到訊息佇列的id msgget 3傳送訊息 接收訊息 msgsnd msgrev 4釋放訊息佇列 釋放訊息佇列 msgctl 例項程式 程序1 讀 int ...