8 linux程序間通訊之訊息佇列

2021-06-03 18:25:26 字數 3103 閱讀 6412

訊息佇列

定義:

unix早期的通訊機制之一的訊號能夠傳送的資訊量有限,管道則只能傳      送無格式的位元組流,這無疑會給應用程式的開發帶來不便。訊息佇列(也叫報文佇列)則克服了這些缺點。

發展

訊息佇列就是乙個訊息的鍊錶。可以把訊息看作乙個記錄,具有特定的格式。程序可以向其中按照一定的規則新增新訊息;另一些程序則可以從訊息佇列中讀走訊息

分類

ø         posix訊息佇列

ø         系統v訊息佇列

持續性

系統v訊息佇列是隨核心持續的,只有在核心重啟或者人工刪除時,該訊息佇列才會被刪除。

鍵值

訊息佇列的核心持續性要求每個訊息佇列都在系統範圍內對應唯一的鍵值,所以,要獲得乙個訊息佇列的描述字,必須提供該訊息佇列的鍵值。

#include

#include

key_t ftok (char *pathname ,char proj)

功能:返回檔案對應的鍵值

pathname :檔名

proj:專案名(不為0即可)

開啟/建立

#include

#include

#include

int msgget (key_t key , int msg***)

key:鍵值。由ftok獲得

msg***:標誌位

返回值:與鍵值key相對應的訊息佇列描述字。

標誌位有:

²ipc_creat建立新的訊息佇列

²ipc_excl與ipc_creat一同使用,表示如果要建立的訊息佇列已經存在,則返回錯誤

²ipc_nowait讀寫訊息佇列要求無法得到滿足時,不阻塞

建立

下面兩種情況下,將建立乙個新的訊息佇列:

ø         如果沒有與鍵值key相對應的訊息佇列,並且mag***中包含了ipc_creat標誌位。

ø         key引數為ipc_private

建立:

int open_queue (key_t keyval)

int qid;

if ((qid=msgget (keyval,ipc_creat))==-1)

return (-1); 

return (qid);

傳送訊息

#include

#include

#include

int msgsnd ( int msqid, struct msgbuf  *msgp, int    msgsz,  intmsg***)

功能:向訊息佇列中傳送一條訊息

ø         msgid 已開啟的訊息佇列的id

ø         msgp 存放訊息的結構

ø         msgsz 訊息資料長度

ø         msg*** 傳送標誌,有意義的msg***標誌為ipc_nowait,指明在訊息佇列沒有足夠的空間容納要傳送的訊息時,msgsnd是否等待。

struct msgbuf

long mtype; //訊息的型別 >0

char mtext[1];  //訊息資料的首位址

接受訊息:

#include

#include

#include

int msgrcv (int msqid, struct msgbuf *msgp,int msgsz,long  msgtyp,int msg***)

功能

從msqid代表的訊息佇列中讀取乙個msgtyp型別的訊息,  並把訊息儲存在msgp指向的msgbuf結構中。在成功的讀取了一條訊息以後,佇列中的這條訊息將被刪除

intread_message(int qid,long type,struct mymsgbuf *qbuf)

int result,length;

length=sizeof(struct mymsgbuf)-sizeof (long);

if ((result=msgrcv(qid,qbuf,length,type,0))==-1)

return (-1);

return (result);

例題:msg.c

#include

#include

#include

struct msg_buf

;int main()

msgbuf.mtype = getpid();

strcpy(msgbuf.data,"test haha");

ret=msgsnd(msgid,&msgbuf,sizeof(msgbuf.data),ipc_nowait);

if(ret==-1)

memset(&msgbuf,0,sizeof(msgbuf));    //記憶體設定。                         ret=msgrcv(msgid,&msgbuf,sizeof(msgbuf.data),getpid(),ipc_nowait);

if(ret==-1)

printf("recv msg =[%s]\n",msgbuf.data);

}

8 程序間通訊 訊息佇列

使用訊息佇列實現程序間的通訊 首先將傳送的資料打包成訊息的型別,使用乙個程序負責將訊息傳送到訊息佇列中,另外乙個程序負責從訊息佇列中接收資訊,從而實現程序間通訊 1 使用訊息佇列通訊的基本流程 1 獲取key值,使用ftok函式 ftok函式 include include key t ftok c...

linux程序間通訊之訊息佇列

訊息佇列就是乙個訊息的鍊錶。可以把訊息看作乙個記錄,具有特定的格式以及特定的優先順序。對訊息佇列有寫許可權的程序可以向中按照一定的規則新增新訊息 對訊息佇列有讀許可權的程序則可以從訊息佇列中讀走訊息。include include include include include include in...

linux程序間通訊之訊息佇列

訊息佇列 使用訊息佇列的好處 可以給訊息附加特定的訊息型別。訊息佇列用於同一臺計算機的程序間的通訊。include include key t ftok const char pathname,int proj id 該函式根據檔名生成乙個id 系統建立ipc 通訊 訊息佇列 訊號量和共享記憶體 時...