您好,登錄后才能下訂單哦!
今天就跟大家聊聊有關(guān)C++ 中怎么實現(xiàn)一個消息隊列函數(shù),可能很多人都不太了解,為了讓大家更加了解,小編給大家總結(jié)了以下內(nèi)容,希望大家根據(jù)這篇文章可以有所收獲。
1.消息隊列結(jié)構(gòu)體的定義
typedef struct{ uid_t uid; /* owner`s user id */ gid_t gid; /* owner`s group id */ udi_t cuid; /* creator`s user id */ gid_t cgid; /* creator`s group id */ mode_t mode; /* read-write permissions 0400 MSG_R 0200 MSG_W*/ ulong_t seq; /* slot usage sequence number*/ }ipc_perm; typedef stuct{ struct ipc_perm msg_perm; /* read_write perms */ struct msg *msg_first; /* ptr to first message on queue */ struct msg *msg_last; /* ptr to last message on queue */ msglen_t msg_cbytes; /* used bytes current on queue */ msgqnum_t msg_qnum; /* current num of message on queue */ msglen_t msg_qbytes; /* max # of bytes allowed on queue */ pid_t msg_lspid; /* pid of last msgsnd() */ pid_t msg_lrpid; /* pid of last msgrcv() */ time_t msg_stime; /* time of last msgsnd() */ time_t msg_rtime; /* time of last msgrcv() */ time_t msg_ctime; /* time of last msgctl() */ }msqid_ds; typedef struct { long mtype; char mbuf[MSGLEN]; }Message;
2.創(chuàng)建消息隊列:
/*************************************************** Function: int msgget(ket_t key,int oflag); Explain: create or view a message queue Return : a int indetify Include: sys/msg.h introduction: oflag: 0400 msg_r 0200 msg_w 0600 msg_wr ipc_creat: NO exist and then creat a queue exist : reference a queue ipc_creat|ipc_excl: NO exist and then creat a queue exist : return error ****************************************************/ #include<stdio.h> #include<sys/msg.h> #include<stdlib.h> int MsgGet(int key) { int ret; ret=msgget(key,0600|IPC_CREAT); // ret=msgget(key,0600|IPC_CREAT|IPC_EXCL); if(ret<0) perror("creat msgid error"); printf("msgid=%d/n",ret); system("ipcs -q -i ret"); return ret; } int main(int argc,char *agrv[]) { int key; printf("pleasse input msgkey:"); scanf("%d",&key); MsgGet(key); return 0; }
3.向消息隊列中發(fā)送消息msgsnd
/*********************************************************************************** Function: int msgsnd(int msqid,const void *ptr,size_t length,int flag) Explain: send a message to a queue Return: len: send message len; Include: sys/msg.h Introduction: flag: 0 : if queue full wait:1>具備存放新消息的空間 2>由msqid標(biāo)識的消息隊列從系統(tǒng)中刪除(返回EIDRM錯誤) 3>調(diào)用線程被某個捕獲的信號所中斷(返回EINTR錯誤) IPC_NOWAIT:如果沒有存放新消息的空間,函數(shù)馬上返回 1>指定的隊列中有太多的字節(jié) 2>在系統(tǒng)范圍存在太多的消息 *****************************************************************************************/ #include "typemsg.h" int MsgSnd(int msqid,char *buf,int len,int flag) { int ret; ret=msgsnd(msqid,buf,len,flag); if(ret<0) perror("msgsnd error"); system("ipcs -q"); return ret; } int main() { int msqid,len,stype; Message msgb; memset(&msgb,0,sizeof(Message)); printf("msgsnd:please input msqid:"); scanf("%d",&msqid); printf("please input msgtype:"); scanf("%d",&stype); msgb.mtype=stype; strcpy(msgb.mbuf,"zhangweia"); MsgSnd(msqid,(char *)&msgb,sizeof(Message),0); return 0; }
4.從隊列中獲取消息 msgrcv
/********************************************************************* Function: int msgrcv(int msqid,const void *ptr,size_t msglen,long type,int flag) Explain: recv message order by type msgrcv error: Argument list too long --> msglen的長度小于消息體中消息的長度 Para : ptr: point to message struct msglen: 由ptr指向的緩沖區(qū)中數(shù)據(jù)部分的大小,這個是該函數(shù)能夠返回的最大數(shù)據(jù)量 type: message type; 1> 0:返回隊列中最早的消息 2> 大于0:返回消息隊列中類型為type的第一個消息 3> 小于0:返回消息隊列中類型小于或者等于type的絕對值的消息類型中最小的第一個消息 flag: 0<wait> 沒有消息或者消息類型不符合的時候,線程等待 響應(yīng): 1>有一個所請求類型的消息可以獲取 2>msqid的消息隊列被系統(tǒng)刪除,返回一個EIDRM 3>調(diào)用線程被某個捕獲的信號所中斷 IPC_NOWAIT:在沒有數(shù)據(jù)的情況下,立即返回一個ENOMSG錯誤 MSGNOERROR:當(dāng)所接受的消息數(shù)據(jù)部分大于msglen長度時,獲取截短的數(shù)據(jù)部分,否則返回E2BIG錯誤 Return: message len *********************************************************************/ #include "typemsg.h" int MsgRcv(int msqid,char *buf,int msglen,long type,int flag) { int ret; ret=msgrcv(msqid,buf,msglen,type,flag); if(ret<0) perror("msgrcv error"); system("ipcs -q"); return ret; } int main() { int msqid,len; long ttype; Message mbuf; printf("msgrcv:please input recv msqid:"); scanf("%d",&msqid); MsgRcv(msqid,(char *)&mbuf,8900,0,IPC_NOWAIT); printf("recv message=%s/n",mbuf.mbuf); Put_String((unsigned char *)&mbuf,sizeof(Message)); return 0; }
6.消息隊列的控制msgctl
/********************************************************** Function: int msgctl(int msqid,int cmd,struct msqid_ds *buff) Explain: cdm: IPC_RMID; delete msqid IPC_SET: IPC_STAT: return msqid stat *********************************************************/ #include "typemsg.h" int MsgCtl(int msqid,int cmd,struct msqid_ds *buff) { int ret; ret=msgctl(msqid,cmd,buff); if(ret<0) { perror("msgctl error"); return -1; } return 0; } int main() { int msqid,type; struct msqid_ds info; printf("please input msqid /nand type(1:icp_rmid;2:ipc_stat)"); scanf("%d%d",&msqid,&type); if(type==1) { MsgCtl(msqid,IPC_RMID,NULL); printf("delete queue success:%d/n",msqid); }else if(type==2) { MsgCtl(msqid,IPC_STAT,&info); printf("get queue stat:%d/n",msqid); } return 0; }
看完上述內(nèi)容,你們對C++ 中怎么實現(xiàn)一個消息隊列函數(shù)有進(jìn)一步的了解嗎?如果還想了解更多知識或者相關(guān)內(nèi)容,請關(guān)注億速云行業(yè)資訊頻道,感謝大家的支持。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。