首页 > 其他分享 >消息队列

消息队列

时间:2023-05-03 17:11:38浏览次数:33  
标签:msgBuf 队列 int 消息 key include

  • sys/msg.h
#include <sys/msg.h>


int main(void){
    // 创建消息队列
    // 通过key创建或获取消息队列 返回消息队列ID 失败返回-1
    /*
     * msgget 创建或获取消息队列
     *  key: ftok函数返回的key
     *  msgflg 标志位置
     *      0           - 获取 不存在即失败(是否存在根据key来判断)
     *      IPC_CERAT   - 创建 不存在即创建,已存在即获取(是否存在根据key来判断)
     *      IPC_EXCL    - 排它 不存在即创建,已存在即失败(是否存在根据key来判断)
     * */
    // 表示创建权限为0664内存不获取旧的消息队列


    // 发送消息
    /*
     * msgsnd 发送消息
     * msgid int msgget获取的消息队列ID
     * msgp void const*  指针,指向一块包含消息类型和消息数据的内存块,该内存的前4(如果是64为系统则是前8)个字节必须是一个大于0的整数,代表消息类型,其后紧跟消息数据v
     * msgsz size_t 期望发送消息数据(不包含消息类型)的字节数
     * msgflg int  发送标志(阻塞、非阻塞),一般取0
     *      0 阻塞
     *      IPC_NOWAIT 非阻塞 当内核消息队列已达上线 会返回-1 并且errno 设置为EAGAIN
     * */

    // 接收消息
    /*
     * msgrcv 接收消息
     * msgid int msgget获取的消息队列ID
     * msgp void const*  指针,指向一块包含消息类型和消息数据的内存块,该内存的前4(如果是64为系统则是前8)个字节必须是一个大于0的整数,代表消息类型,其后紧跟消息数据v
     * msgsz size_t 期望接收消息数据(不包含消息类型)的字节数
     * msgtype long 消息数据的类型
     *      0 默认。接收消息队列的第一条数据
     *      >0 如果msgflg参数不包含MSG_EXCEPT位,则提取消息队列第一条类型为msgtype的消息,如果msgflg参数包含MSG_EXCEPT位,则提取消息队列第一条类型不为msgtype的消息
     *      <0 提取消息队列中类型小于等于绝对值msgtype的消息,类型越小消息越被优先提取
     * msgflg int  发送标志(阻塞、非阻塞),一般取0
     *      0 阻塞
     *      IPC_NOWAIT 非阻塞 当内核消息队列已达上线 会返回-1 并且errno 设置为EAGAIN
     * 注:
     *  1.如果存在匹配类型的消息数据,但是数据长度大于msgsz,并且msgflg位包含MSG_NOERROR,则之截取msgsz数据剩余的直接丢弃,如果msgflg位不包含MSG_NOERROR,则不处理该消息,返回-1 并且errno 设置为E2BIG
     *  2.如果存在匹配类型的消息数据,msgrcv函数会将消息移出消息队列,并返回所接收到消息数据的字节数,表示接收成功。
     *     否则函数会阻塞,直到消息队列中有可接受的消息为止,如果msgflg位包含IPC_NOWAIT,则函数不会阻塞,而是返回-1,并且errno 设置为ENOMSG
     *
     * */

    // 消息控制
    /*
     * msgctl
     * msgid int msgget获取的消息队列ID
     * cmd   要做的操作
     *      IPC_RMID 销毁共享内存
     *  buf NULL
     *  成功返回0 失败返回-1
     *  备注:调用销毁时,并非立即销毁,需要加载计数为0时才真正销毁;并且其他进程无法创建与这块共享内存的映射,之前已经创建的不受影响
     * */

    return 0;
}
  • 写端
#include <stdio.h>
#include <sys/msg.h>
#include <string.h>

int main(void) {
    // 创建key
    key_t key = ftok(".", 8);
    // 创建消息队列
    int msgid = msgget(key, IPC_CREAT | IPC_EXCL | 0664);
    // 往消息队列中发送消息
    for (;;) {
        struct {
            long msgType;
            char msgData[128];
        } msgBuf = {100, ""};
        fgets(msgBuf.msgData, sizeof(msgBuf.msgData), stdin);
        if (strcmp(msgBuf.msgData, "!\n") == 0) {
            break;
        }
        if (msgsnd(msgid, &msgBuf, sizeof(msgBuf) - sizeof(msgBuf.msgType), 0) == -1) {
            perror("msgsnd");
            return -1;
        }
    }
    // 销毁消息队列
    if (msgctl(msgid, IPC_RMID, NULL) == -1) {
        perror("msgctl");
        return -1;
    }
    return 0;
}
  • 读端
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/msg.h>
#include <string.h>
#include <errno.h>

int main(void) {
    // 创建key
    key_t key = ftok(".", 8);
    // 获取消息队列
    int msgid = msgget(key, 0);
    // 接收消息
    for (;;) {
        struct {
            long msgType;
            char msgData[128];
        } msgBuf = {100, ""};
        if (msgrcv(msgid, &msgBuf, sizeof(msgBuf) - sizeof(msgBuf.msgType), 100, 0) == -1) {
            if (errno == EIDRM) {
                printf("消息队列关闭\n");
                break;
            } else {
                perror("msgrcv");
                return -1;
            }

        }
        printf("msgType:%ld msgData:%s\n", msgBuf.msgType, msgBuf.msgData);
    }

    return 0;
}

标签:msgBuf,队列,int,消息,key,include
From: https://www.cnblogs.com/wtil/p/17369323.html

相关文章

  • 云原生技术实践营「微服务X消息队列专场」
    微服务和消息队列都是当前比较流行的架构模式,可以帮助开发者在实际业务中解决大型复杂分布式系统面临的各种挑战:微服务架构是一种云原生架构方法,目的是提高系统的扩展性、可靠性和灵活性,它提倡将单一的应用程序划分成一组小的服务,服务之间互相协调、互相配合,每个服务运行在其独立......
  • c语言数据结构-----循环队列
    #include<stdio.h>#include<stdlib.h>#defineMAXSIZE10//循环队列长度为m-1时即为满typedefstruct{ intfront; intrear; int*base;}SqQueue;//初始化队列intInitQueue(SqQueue&q){ q.base=newint[MAXSIZE]; q.front=q.rear=0; return0;}//求队列长度int......
  • MFC-NM_CLICK鼠标左键点击CListCtrl控件消息
    NM_CLICK是鼠标左键点击CListCtrl控件客户区时激发的消息添加消息函数选中控件-->          ......
  • linux 内核 工作队列
    简介工作队列是将操作延期执行的另一种手段。因为它们是通过守护进程在用户上下文执行,函数可以睡眠任意长的时间。对每个工作队列来说,内核都会创建一个新的内核守护线程。新的工作队列通过调用 create_workqueue 或 create_workqueue_singlethread 函数来创建。前一个函数在......
  • rabbitmq 延迟队列_Delayed Message 插件实现 RabbitMQ 延迟队列
    延迟队列是为了存放那些延迟执行的消息,待消息过期之后消费端从队列里拿出来执行。作者简介:五月君,NodejsDeveloper,慕课网认证作者,热爱技术、喜欢分享的90后青年,欢迎关注Nodejs技术栈(id:NodejsRoadmap)和Github开源项目 https://www.nodejs.redDLX+TTL方式存在的时序问......
  • 队列
    1.队列的概念及结构队列:只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,队列遵循先进先出FIFO(FirstInFirstOut),与栈的后进先出相反。入队列:进行插入操作的一端称为队尾出队列:进行删除操作的一端称为队头2.队列的实现队列也可以数组和链表的结构实现,使用链......
  • 创建队列时对结构体指针的理解
    1#include<stdio.h>2#include<stdlib.h>34#defineElemTypeint56//定义队列结点7typedefstructQNode8{9ElemTypedata;10structQNode*next;11}QNode,*QNodePrt;1213//定义队首、队尾指针14typedefstruct15{16QNo......
  • 优先队列
    优先队列有两个分支,一个是小根堆,一个是大根堆。这是一个优先队列的定义:priority_queue<int>q;默认是大根堆。大根堆,也就是堆顶是最大的数,按着降序排到堆底。小根堆,也就是堆顶是最小的数,按着升序排到堆底。大根堆定义:priority_queue<int>q;由大根堆转小根堆有三种方......
  • c语言创建队列的链式存储
    #include<stdio.h>#include<stdlib.h>typedefstructLinkNode{intdata;structLinkNode*next;}LinkNode;typedefstructLink{LinkNode*front,*rear;//frontrear为链表的伴随指针}LinkQueue;//初始化voidInitQueue(LinkQueue*......
  • 第三章-栈 队列和数组
    栈stack数据接口三要素逻辑,运算,存储只允许在一端进行数据插入和删除操作.LIFO规则,lastinfirstout先进后出联想到烤串.doge卡特兰数(catalan),n个不同元素进栈,出栈元素不同排列的个数为顺序栈链栈只在头结点插入和删除就是链栈队列FIFOfirstinfirsto......