Linux程序通訊 訊息佇列

2021-06-01 01:06:18 字數 3272 閱讀 4069

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 ...