unix程序區訊息佇列學習筆記

2021-06-17 18:32:33 字數 2730 閱讀 4924

unix系統中程序可以通過訊息進行通訊,訊息是格式化的可變長度的資訊單元,包含訊息型別、資料長度及資料三部分內容。每個訊息都有乙個唯一的名稱key,同時還有乙個唯一的訊息佇列描述符。

訊息佇列的使用:

1、建立:

呼叫: int msgget(intkey,int flags);

key為訊息佇列名稱,flags為使用者設定標誌,一般設定訊息佇列的訪問許可權等,許可權取值如下:

許可權  

八進位制整數

使用者可寫  

0400

使用者可讀 

0200

同組可寫  

0040

同組可讀 

0020

其它可寫  

0004

使用者可讀 

0002

許可權值可加和組合,如msgget(0x888,0660|ipc_creat)表示建立佇列名稱為0x888,使用者和同組可讀寫的訊息佇列,返回佇列描述符,如果該訊息佇列已存在則返回對應的訊息佇列描述符。

2、傳送:  

呼叫: 

int msgsnd(intmsgid,(void*)&mymsg,int msgsz,int msg***)

msgid為msgget返回的訊息佇列描述符,mymsg是指向傳送訊息的結構,結構需要定義,格式如:

struct mymsg{

long mytype; 

//訊息型別

char msgtext; 

//訊息內容

}msgsz是訊息內容msgtext的長度,msg***是訊息設定,一般指定無記憶體儲存訊息時程序等待還是返回。

函式成功返回0 失敗返回 -1

3、接收:

呼叫 

int msgrcv(intmsgid,(void*)&mymsg,int msgsz,int msgtyp,intmsg***)  

msgid、mymsg、msgsz、msg***都與msgsnd的一致,msgtyp指定使用者讀取訊息的型別,如:

(1)msgtyp=0,返回unix訊息佇列中的第乙個訊息

(2)msgtyp>0,返回unix訊息佇列中型別為msgtyp的第乙個訊息

(3)msgtyp<0,返回unix訊息佇列中小於等於msgtyp絕對值的最低型別的第乙個訊息

函式成功返回0 失敗返回 -1。

4、訊息佇列的控制:

呼叫: 

int msgctl(int msgid,intcmd,(struct msgid_ds*)&buf) 

msgid是要操作的佇列描述符,cmd是操作型別,如:

ipc_stat檢視訊息佇列的狀態,結果放入buf指向的結構

ipc_rmid刪除指定的msgid及其相關的佇列和結構

ipc_set為指定的msgid設定屬主標識、同組標識、操作權、最大位元組數等

5、自測例項:

//傳送方,讀取輸入,傳送到key為0x1234的訊息佇列中

msgc.c:

#include

#include

#include

#include

#include

struct mymsg

;int main(void)

memset(&mybuf,0,sizeof(mybuf));

mybuf.mtype = getpid();

printf("please input your message: \n");

fgets(mybuf.ctx,sizeof(mybuf.ctx),stdin);

rc =msgsnd(msgid,(void*)&mybuf,strlen(mybuf.ctx),ipc_nowait);

if(rc < 0)

else

return 0;}

//讀取方,從0x1234中讀取第一條訊息並輸出 

msgs.c:

#include

#include

#include

#include

#include

struct mymsg

;int main(void)

memset(&buf,0,sizeof(buf));

rc =msgrcv(msgid,(void*)&buf,sizeof(buf.ctx),0,ipc_nowait);

if(rc < 0)

fprintf(stderr,"get the message : pid: %d,len:%d,message:%s.\n",buf.mtype,rc,buf.ctx);

return 0;}

make編譯後執行結果:

#./tmsgc

please input your message: 

hello this is the test message!

send message success.

#./tmsgs

get the message : pid: 925830,len:32,message: hello this isthe test message! .

#ipcs -q  

//檢視ipc

t  

id  

key 

mode  

owner  

group

q 186646559 0x00001234 --rw-rw-rw-  

rk  

db2grp

程序通訊 訊息佇列 聽課筆記

隨核心持續 size x large 鍵值 size include include key t ftok char pathname,char proj pathname 檔名 proj 專案名,不為0即可 返回檔名對應的鍵值 size x large 開啟訊息佇列 size include in...

程序間學習小結(訊息佇列)

ipc隨程序持續 隨核心持續以及隨檔案系統持續的定義 1.隨程序持續 ipc一直存在到開啟ipc物件的最後乙個程序關閉該物件為止。如管道和有 名管道 2.隨核心持續 ipc一直持續到核心重新自舉 即重啟 或者顯示刪除該物件為止。如訊息佇列 信 號燈以及共享記憶體等 3.隨檔案系統持續 ipc一直持續...

UNIX環境下如何應用訊息佇列實現程序間通訊

一 引言 進入九十年代後,隨著計算機和網路技術的發展,很多資料處理系統都採用開放系統結構的客戶機 伺服器網路模式。即客戶機提出任務請求,由伺服器做相應處理,執行被請求的任務,然後將結果返回給客戶機。例如 銀行atm的前置機和資料處理的主機之間即構成客戶機 伺服器模式 銀行的前置機和銀行資料處理主機之...