linux消息队列总结

news/2024/12/30 3:31:28/

消息队列,是消息的链接表,存放在内核中。一个消息队列由一个标识符(即队列ID) 来标识
1、特点
(1)消息队列是面向记录的,其中的消息具有特定的格式以及特定的优先级
(2)消息队列独立于发送与接收进程。进程终止时,消息队列及其内容并不会被删除.
(3)消息队列可以实现消息的随机查询,消息不一定要以先进先出的次序读取,也可以按消息的类型读取。

2、函数原型

头文件:
#include<sys/ipc.h>

#include<sys/types .h>

#include<sys/msg.h>


 //创建或打开消息以列: 成功返回以列ID,失败返回-1
int msgget(key_t key, int msgflg);


 //添加消息: 成功返同0,失败返同-1
int msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg);


 //读取消息: 成功返回消息数据的长度,失败返回-1
 int msgrev (int msqid, void *otr, eize : size, long type,int flag)!


// 控制消息队列: 成功返回0,失败返回-1
int msgctl(int msqid, int cmd, struct msqid_ds *buf);

在以下两种情况下,msgget将创建一个新的消息队列:
(1) 如果没有与键值key相对应的消息队列,并且flag中包含了IPC_CREAT标志位
(2) key参数为IPC PRIVATE。
函数msgrcv在读取消息队列时,type参数有下面几种情况
(1) type == 0,返回队列中的第一个消息
(2) type >0,返回队列中消息类型为 type 的第一个消息
(3) type<0,返回队列中消息类型值小于或等于 type 绝对值的消息,如果有多个,则取类型值最小的消息。.
可以看出,type值非0时用于以非先进先出次序读消息。也可以把 type 看做优先级的权值

系统立IPC通讯(消息队列、信号量和共享内存) 时必须指定一个ID。适常情况下,该id值过ftok函数得到

ftok原型
头文件
#include <sys/types.h>
#include <sysipc.h>
函数原型:
key_t ftok( const char * fname, int id )
fname就是你指定的文件名《已经存在的文件名》,一般使用当前目录,如:
key_t key;
key = ftok(".",1); 这样就是将fname设为当前目录。

封装接收消息代码:

#include <stdio.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <string.h>
//       int msgget(key_t key, int msgflg);
//        int msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg);

//       ssize_t msgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp,
//                      int msgflg);
struct msgbuf {
               
    long mtype;       /* message type, must be > 0 */
        char mtext[256];    /* message data */
};


int main()
{
    //1.huoqu
    struct msgbuf readBuf;    


    key_t key;
    key = ftok(".",'m');
    printf("key=%x\n",key);

    int msgId = msgget(key, IPC_CREAT|0777);
    if(msgId == -1 ){
        printf("get que failuer\n");
    }
    memset(&readBuf,0,sizeof(struct msgbuf));

    msgrcv(msgId, &readBuf,sizeof(readBuf.mtext),888,0);    
    printf("read from que:%s\n",readBuf.mtext);

        struct msgbuf sendBuf = {988,"thank you for reach"};
        msgsnd(msgId,&sendBuf,strlen(sendBuf.mtext),0);

    msgctl(msgId,IPC_RMID,NULL);

    return 0;
}

封装发送消息代码:

#include <stdio.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <string.h>
//       int msgget(key_t key, int msgflg);
//        int msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg);

//       ssize_t msgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp,
//                      int msgflg);
struct msgbuf {
               
    long mtype;       /* message type, must be > 0 */
        char mtext[256];    /* message data */
};


int main()
{
    //1.huoqu
    struct msgbuf sendBuf = {888,"this is message from quen"};    
    struct msgbuf readBuf;

    memset(&readBuf,0,sizeof(struct msgbuf));
    key_t key;
    key = ftok(".",'m');
    printf("key=%x\n",key);

    int msgId = msgget(key, IPC_CREAT|0777);

    if(msgId == -1 ){
        printf("get que failuer\n");
    }
    
    msgsnd(msgId,&sendBuf,strlen(sendBuf.mtext),0);
    printf("send over\n");

        msgrcv(msgId, &readBuf,sizeof(readBuf.mtext),988,0);
    printf("return from get:%s\n",readBuf.mtext);
    
    msgctl(msgId,IPC_RMID,NULL);
    
    return 0;
}
编译结果:


http://www.ppmy.cn/news/93931.html

相关文章

使用C++调用Yolo模型的方法与步骤

目录 ## 1. 引言 ## 2. Yolo算法简介 ## 3. 准备工作 ## 4. 安装依赖库 ## 5. 下载Yolo模型权重文件 ## 6. 加载Yolo模型 ## 7. 图像预处理 ## 8. 目标检测与后处理 ## 9. 结果可视化 ## 10. 总结 ## 1. 引言 随着计算机视觉技术的不断发展&#xff0c;目标检测在许…

C语言工资纳税系统

工资纳税系统 个人所得税每月交一次&#xff0c;底线是1600元/月&#xff0c;也就是超过了1600元的月薪才开始计收个人所得税。个人所得税税率表一&#xff08;工资、薪金所得适用&#xff09; 级数----------全月应纳税所得额----------税率&#xff08;&#xff05;&#x…

Roblox 不但不支持 Linux,还屏蔽了 Wine

导读据悉&#xff0c;Roblox 不但不支持 Linux&#xff0c;还屏蔽了 Wine。 Roblox 不但不支持 Linux&#xff0c;还屏蔽了 Wine 多人游戏 Roblox 没有 Linux 原生版本&#xff0c;但之前可以通过 Wine 在 Linux 上运行。不过其最新的反作弊软件专门屏蔽了 Wine 应用&#xff…

如何从文档中提取结构化数据?parsio.io

parsio.io 产品名&#xff1a;Parsio电子邮件解析器 技术&#xff1a;采用人工智能技术的电子邮件解析器。 支持多种格式&#xff1a; 可以解析电子邮件和附件中的数据&#xff0c;包括PDF、HTML、XLSX&#xff08;Excel&#xff09;、CSV、DOCX、XML、TXT等格式。 提取模版&am…

新快报:十年聚焦,巨杉数据库打造中国基础软件的“原创力”

广东省级主流媒体新快报策划“非凡十年&#xff0c;广州答卷”专题&#xff0c;关注十年来广州的“原创力量”&#xff0c;作为土生土长的广州基础软件创新企业&#xff0c;巨杉数据库十年聚焦&#xff0c;从零打造原生分布式数据库&#xff0c;获得逾百家金融银行客户认可&…

图的拓扑排序AOV网,有向无环图DAG描述表达式,关键路径AOE网。

一&#xff0c;有向无环图DAG描述表达式 1.DAG 若一个有向图中不存在环&#xff0c;则称为有向无环图&#xff0c;记为DAG。 2.用二叉树描述表达式 3.用DAG描述表达式 用二叉树描述表达式有缺点&#xff0c;有些结点大可不必存储&#xff0c;可以共用。 step1:把各个操作数…

2023年ChatGPT商业版免授权源码/AI绘画/付费系统

这里写自定义目录标题 欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题&#xff0c;有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants 创建一个自定义列表如何创建一个…

【源码解析】EasyExcel导入导出源码解析

EasyExcel介绍 Java解析、生成Excel比较有名的框架有Apache poi、jxl。但他们都存在一个严重的问题就是非常的耗内存&#xff0c;poi有一套SAX模式的API可以一定程度的解决一些内存溢出的问题&#xff0c;但POI还是有一些缺陷&#xff0c;比如07版Excel解压缩以及解压后存储都…