程序通訊之訊息佇列

2021-09-13 00:24:02 字數 3620 閱讀 1715

1.測試**

#include#include#include#include#include#include#include#includevoid msg_show(int msg_id,struct msqid_ds msg_info)

printf("\n");

/*show msg_info*/

printf("the uid of msg is %d\n",msg_info.msg_perm.uid);

printf("the gid of msg is %d\n",msg_info.msg_perm.gid);

printf("現在訊息佇列中的位元組數: %ld\n",msg_info.msg_cbytes);

printf("現在佇列中的訊息數: %d\n",msg_info.msg_qnum);

printf("現在訊息佇列中的最大位元組數: %d\n",msg_info.msg_qbytes);

printf("最後傳送訊息的程序: %d\n",msg_info.msg_lspid);

printf("最後接受訊息的程序: %d\n",msg_info.msg_lrpid);

}int main()

; struct msqid_ds msg_info; /*creat msg queue*/

struct msgmbuf msg_mbuf; /*訊息緩衝結構*/

char *rpath="/home/18/";

int msg_sflags,msg_rflags;

key=ftok(rpath,'b'); /*create key*/

if(-1!=key)

else

msg_flags=ipc_creat|ipc_excl;

msg_id=msgget(key,msg_flags);

if(-1==msg_id)

msg_show(msg_id,msg_info);

memcpy(msg_mbuf.mtext,"test message",sizeof("test message"));

ret=msgsnd(msg_id,&msg_mbuf,sizeof("test message!!"),ipc_nowait);

if(ret==-1)

printf("send failed!\n");

msg_show(msg_id,msg_info);

msg_rflags=ipc_nowait|msg_noerror;

ret=msgrcv(msg_id,&msg_mbuf,20,0,msg_rflags);

if(-1==ret)

printf("mes receive failed!!\n");

msg_show(msg_id,msg_info);

msg_info.msg_perm.uid=8;

msg_info.msg_perm.gid=8;

msg_info.msg_qbytes=12345;

ret=msgctl(msg_id,ipc_set,&msg_info);/*set the property of msg*/

if(-1==ret)

msg_show(msg_id,msg_info);

ret=msgctl(msg_id,ipc_rmid,null);

if(ret==-1)

printf("delete failed!!\n");

return 0;

}

2.訊息佇列結構

什麼是訊息佇列?

訊息佇列是核心位址空間的內部鍊錶,通過linux各個程序之間傳遞訊息。訊息佇列通過ipc識別符號區分

佇列上乙個訊息的結構

#includestruct msgbuf

該結構可以自己定義

訊息的大小在msg.h中有限制

#define msgmax 8192
訊息佇列結構

#includestruct msqid_ds

;struct ipc_perm

;

3.操作函式

鍵值構建函式

#include#includekey_t ftok(const char *pathname,int proj_id);

//如:

key_t key;

char *rpath="/ipc/msg/"

key=ftok(rpath,'a');

//第乙個引數是已經存在的目錄

//第二個引數一般是『a』,'b'

從佇列中獲取訊息

#include#include#includeint msgget(key_t key,int msgflag);

//第乙個引數是鍵值,用ftok()生成,拿來與核心中訊息佇列的值比較

//megflag取值如下:

ipc_creat:如果比較過後核心空間沒有該訊息佇列,就建立它

ipc_excl:通常與ipc_creat一起使用,如msgflag=ipc_creat|ipc_excl;

//返回值:meg_id==>佇列識別符號

傳送訊息函式

#include#include#includeint msgsnd(int msgqid,const void *msgp,size_t msgsz,int msgflag);

//第乙個引數是用msgget得到的識別符號

//第二個是指向訊息緩衝區

//第三個是訊息的大小(以位元組為單位),不包含訊息型別

//可取值:

0:表示忽略

ipc_nowait:

//返回值:-1表示傳送訊息失敗

接收訊息函式

#include#include#includessize_t msgrcv(int msqid,void* msgp,size_t msgsz,logn msgtyp,int msg***);

//第乙個引數指定訊息佇列

//第二個指向存放訊息緩衝區

//第三個緩衝區大小(不包括mtype)

//第四個訊息型別(如果為0返回佇列中最老的訊息)

//第五個

訊息控制函式

#include#include#includeint msgctl(int msqid,int cmd,struct msqid_ds *buf);

//函式用途:向核心傳送乙個cmd命令,buf為應用層和核心空間資料交換的指標

cmd取值為:

ipc_stat:獲取佇列的msqid_ds結構,並把它存在buf位址中

ipc_set:設定佇列的ipc_perm成員值,這個值先存在buf裡

ipc_rmid:刪除佇列

程序通訊之訊息佇列

程序通訊之訊息佇列 一 前言 前面講過,程序間管道的通訊,訊號量控制的通訊,以及一開始的訊號,這些都是程序的通訊方式。訊號通過響應某些條件產生事件,使得另一程序 即接收訊號的程序 做出相應的反應。管道是通過一端寫,另一端讀的方式進行通訊,即所謂的點對點通訊。訊號量是控制程序間對臨界資源訪問的乙個計數...

程序間通訊之訊息佇列

include include define max msg buf len 512 int ikey 6004 struct ipcmsgbuf int main void 寫訊息佇列 memset msgdata,0,sizeof struct ipcmsgbuf msgdata.mtype 1...

linux c 程序通訊之訊息佇列

訊息佇列是乙個存放在核心中的訊息鍊錶,每個訊息佇列由佇列識別符號標識,與管道不同的是訊息佇列是放在核心當中,只有在核心重啟,或者顯式的刪除乙個訊息佇列,該訊息佇列才會被真正的刪除,以下會有幾個操作,1.建立訊息佇列 include include key t ftok const char path...