消息队列函数

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;

}

时间: 2024-11-17 18:03:37

消息队列函数的相关文章

消息队列函数(msgget、msgctl、msgsnd、msgrcv)小记学习

一.什么是消息队列        消息队列提供了一种从一个进程向另一个进程发送一个数据块的方法. 每个数据块都被认为含有一个类型,接收进程可以独立地接收含有不同类型的数据结构.我们可以通过发送消息来避免命名管道的同步和阻塞问题.但是消息队列与命名管道一样,每个数据块都有一个最大长度的限制. Linux用宏MSGMAX和MSGMNB来限制一条消息的最大长度和一个队列的最大长度. 二.在Linux中使用消息队列        Linux提供了一系列消息队列的函数接口来让我们方便地使用它来实现进程间的

进程间通信之消息队列通信

概念 消息队列 消息队列提供了一个从一个进程向另外一个进程发送一块数据的方法 每个数据块都被认为是有一个类型,接收者进程接收的数据块可以有不同的类型值 消息队列也有管道一样的不足,就是每条消息的最大长度是有上限的(MSGMAX),每个消息队列的总字节数(内核缓冲上限)是有上限的(MSGMNB),系统上消息队列的总数(消息条目数)也有一个上限(MSGMNI) 对比: 管道 消息 流管道 有边界 先进先出 可以后进入.先出来 消息大小三大限制 cat /proc/sys/kernel/msgmax最

第二十三天:共享内存.消息队列及mysql数据库使用

共享内存和消息队列也是进程间的通信方式. 共享内存,(和信号量的操作类似) #include<sys/shm.h> 1.int shmget(key_t key,size_t size,int shmflg); 作用:新建一块内存或者返回已建好的内存 参数:key,用于表示开辟一段内存,各进程通过这个标志访问同一块内存 size,内存的大小 shmflg,和文件操作完全相同权限表示,按位或IPC_CREATE表示创建一块内存,如果key表示的内存已经建立,即使加了IPC_CREATE也不会新建

php中对共享内存,消息队列的操作

http://www.cnblogs.com/fengwei/archive/2012/09/12/2682646.html php作为脚本程序,通常生命周期都很短,如在web应用中,一次请求就是php运行的 一个周期,请求结束则生命周期截止.所以php在处理需要共 享的资源时,一般会将共享数据保存在数据库或dbm之类的文件中,再者就是利用内存实现共享.你可以选择已有的工具辅助你,像memcache:也可以自 己编写代码访问操作系统的共享内存段. php中对共享内存段的操作有两组函数:Syste

进程间通信(IPC)之————消息队列

一.消息队列 前面提到的进程间通信的一种最基本的方式就是管道,而现在来谈一下另一种进程间的通信方式--消息队列.消息队列是从一个进程向另一个进程发送数据块的方式,每个数据块都有其类型,接收者接收的数据块也可以有不同的类型,这样我们就可以通过发送消息的方式来避免命名管道的同步和阻塞问题. 消息队列不同于管道的是,管道是基于字节流的,而消息队列是基于消息的,而且消息队列的读取方式不一定是先进先出的,消息队列是用链表实现的:但相同的是,它们有一样的不足,就是都有固定的大小,每个消息的大小都有上限(ms

System V的消息队列(1)

消息队列: 消息队列提供了一个从一个进程向另外一个进程发送一块数据的方法 每个数据块都被认为是有一个类型,接收者进程接收的数据块可以有不同的类型值 消息队列也有管道一样的不足,就是每个消息的最大长度是有上限的(MSGMAX),每个消息队列的总的字节数是有上限的(MSGMNB),系统上消息队列的总数也有一个上限(MSGMNI) IPC对象数据结构 内核为每个IPC对象维护一个数据结构 struct ipc_perm { key_t          __key;       /* Key supp

linux消息队列应用编程

消息队列:  消息队列提供了一个从一个进程向另外一个进程发送一块数据的方法   每个数据块都被认为是有一个类型,接收者进程接收的数据块可以有不同的类型值   消息队列也有管道一样的不足,就是每个消息的最大长度是有上限的(MSGMAX),每个消息队列的总的字节数是有上限的(MSGMNB),系统上消息队列的总数也有一个上限(MSGMNI) 对比管道和消息: 管道:流管道        消息:有边界 先进先出              可以后进入.先出来 消息大小三大限制 cat /proc/sys/

Linux消息队列基础

消息队列基本概念 消息队列提供了一个从一个进程向另外一个进程发送一块数据的方法(仅局限与本机) 每个数据块都被认为是有一个类型,接收者进程接收的数据块可以有不同的类型值 消息队列也有管道一样的不足,就是每个消息的最大长度是有上限的(MSGMAX),每个消息队列的总的字节数是有上限的(MSGMNB),系统上消息队列的总数也有一个上限(MSGMNI) 管道 vs. 消息队列: 管道: 流管道          消息: 有边界 先进先出            可以后进入.先出来 消息队列大小三大限制

linux程序设计——消息队列(第十四章)

14.3    消息队列 这章介绍第三个也是最后一个System V IPC机制;消息队列(message queue).消息队列与命名管道有许多相似之处,但少了在打开和关闭管道方面的复杂性.使用消息队列并未解决在使用命名管道时遇到的一些问题,比如管道满时的阻塞问题. 消息队列提供了一种在两个不相关的进程之间传递数据的相当简单且有效的方法. 与命名管道相比,消息队列的优势在于,它独立与发送和接收进程而存在,这消除了在同步命名管道的打开和关闭时可能产生的一些困难. 消息队列提供了一种从一个进程向另