C++ 中消息隊列函數實例詳解。本站提示廣大學習愛好者:(C++ 中消息隊列函數實例詳解)文章只能為提供參考,不一定能成為您想要的結果。以下是C++ 中消息隊列函數實例詳解正文
作者:墨言莫問
這篇文章主要介紹了C++ 中消息隊列函數實例詳解的相關資料,需要的朋友可以參考下C++ 中消息隊列函數實例詳解
1.消息隊列結構體的定義
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.創建消息隊列:
/*************************************************** 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.向消息隊列中發送消息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標識的消息隊列從系統中刪除(返回EIDRM錯誤) 3>調用線程被某個捕獲的信號所中斷(返回EINTR錯誤) IPC_NOWAIT:如果沒有存放新消息的空間,函數馬上返回 1>指定的隊列中有太多的字節 2>在系統范圍存在太多的消息 *****************************************************************************************/ #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指向的緩沖區中數據部分的大小,這個是該函數能夠返回的最大數據量 type: message type; 1> 0:返回隊列中最早的消息 2> 大於0:返回消息隊列中類型為type的第一個消息 3> 小於0:返回消息隊列中類型小於或者等於type的絕對值的消息類型中最小的第一個消息 flag: 0<wait> 沒有消息或者消息類型不符合的時候,線程等待 響應: 1>有一個所請求類型的消息可以獲取 2>msqid的消息隊列被系統刪除,返回一個EIDRM 3>調用線程被某個捕獲的信號所中斷 IPC_NOWAIT:在沒有數據的情況下,立即返回一個ENOMSG錯誤 MSGNOERROR:當所接受的消息數據部分大於msglen長度時,獲取截短的數據部分,否則返回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; }
感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!