C++ 中消息隊列函數(shù)實例詳解
更新時間:2017年06月12日 17:02:57 作者:墨言莫問
這篇文章主要介紹了C++ 中消息隊列函數(shù)實例詳解的相關(guān)資料,需要的朋友可以參考下
C++ 中消息隊列函數(shù)實例詳解
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標識的消息隊列從系統(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:當所接受的消息數(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; }
感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!
相關(guān)文章
C語言的isatty函數(shù)和ttyname函數(shù)以及sendmsg函數(shù)用法
這篇文章主要介紹了C語言的isatty函數(shù)和ttyname函數(shù)以及sendmsg函數(shù)用法,是C語言入門學習中的基礎(chǔ)知識,需要的朋友可以參考下2015-09-09一文帶你了解C語言中的0長度數(shù)組(可變數(shù)組/柔性數(shù)組)
眾所周知,?GNU/GCC?在標準的?C/C++?基礎(chǔ)上做了有實用性的擴展,?零長度數(shù)組(Arrays?of?Length?Zero)?就是其中一個知名的擴展,本文就來聊聊零長度數(shù)組的相關(guān)知識吧2023-03-03C++實現(xiàn)LeetCode(28.實現(xiàn)strStr()函數(shù))
這篇文章主要介紹了C++實現(xiàn)LeetCode(28.實現(xiàn)strStr()函數(shù)),本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細內(nèi)容,需要的朋友可以參考下2021-07-07詳解如何在C/C++中測量一個函數(shù)或功能的運行時間
本文算是一個比較完整的關(guān)于在 C/C++ 中測量一個函數(shù)或者功能的總結(jié),最后會演示三種方法的對比,文章通過代碼示例給大家介紹的非常詳細,需要的朋友可以參考下2023-12-12