zoukankan      html  css  js  c++  java
  • 消息队列函数

    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;

    }

  • 相关阅读:
    WCF系列(一)BasicHttpBinding 和 WsHttpBinding 的不同点
    SQL Server中的事务与锁
    领域驱动设计之领域模型
    http请求到响应经历的阶段
    vs调试
    c# 基本值类型及其默认值
    ASP.NET中JSONP的两种实现以及其他跨域解决方案的简单实现
    通俗易懂,什么是.NET?什么是.NET Framework?什么是.NET Core?
    最完整的数据倾斜解决方案(spark)
    Spark性能调优
  • 原文地址:https://www.cnblogs.com/zhangweia/p/2062450.html
Copyright © 2011-2022 走看看