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的前置機和資料處理的主機之間即構成客戶機 伺服器模式 銀行的前置機和銀行資料處理主機之...