C++ 中消息队列函数实例详解分享

—-想了解C++ 中消息队列函数实例详解分享的全部内容且更多的C语言教程关注<计算机技术网(www.ctvol.com)!!>

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;  }    

www.ctvol.com true Article C++ 中消息队列函数实例详解分享

本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

ctvol管理联系方式QQ:251552304

本文章地址:https://www.ctvol.com/c-cdevelopment/488153.html

(0)
上一篇 2020年11月12日 上午6:14
下一篇 2020年11月12日 上午6:17

精彩推荐