#Linux系统编程(消息队列)

news2024/11/23 6:20:20

(一)发行版:Ubuntu16.04.7


(二)记录:

(1)什么是消息队列

消息队列是一种先进先出的队列型数据结构,实际上是系统内核中的一个内部链表。消息被顺序插入队列中,其中发送进程将消息添加到队列末尾,接受进程从队列头读取消息。多个进程可同时向一个消息队列发送消息,也可以同时从一个消息队列中接收消息。发送进程把消息发送到队列尾部,接受进程从消息队列头部读取消息,消息一旦被读出就从队列中删除

(2)msgget函数

头文件:<sys/types.h>、<sys/ipc.h>、<sys/msg.h>

函数原型:int msgget(key_t key,int msgflg);

参数:key_t key:和消息队列相关的key值

           int msgflg:访问权限

返回值:成功返回消息队列的ID,失败-1

(3)msgctl函数

头文件:<sys/types.h>、<sys/ipc.h>、<sys/msg.h>

函数原型:int msgctl(int msqid,int cmd,struct msqid_ds *buf);

参数:int msqid:消息队列的ID

           int cmd:      IPC_STAT:读取消息队列的属性,然后把它保存在buf指向的缓冲区。

                              IPC_SET:设置消息队列的属性,这个值取自buf参数。

                              IPC_RMID:删除消息队列。

          struct msqid_ds  *buf: 消息队列的缓冲区

返回值:成功返回0,失败返回-1 

 (4)msgget创建消息队列

#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <stdio.h>
int main(void)
{
key_t key;
int msgid;
key=ftok("./m.c",'m');
//创建消息队列
msgid=msgget(key,0666|IPC_CREAT);
if(msgid==-1)
{
printf("create msg error.\n");
return -1;
}
printf("create msg : %d successfully.\n",msgid);
return 0;
}

 查看消息队列和删除消息队列

(查看共享内存ipcs -m)(删除共享内存ipcrm -m 'mid') 

(5)msgsnd函数(发送消息)

头文件:<sys/types.h>、<sys/ipc.h>、<sys/msg.h>

函数原型:int msgsend(int msqid,const void *msgp,size_t msgsz,int msgfly)

参数:int msqid:                      消息队列ID

          const void *msgp:       指向消息类型的指针

          size_t msgsz:                 发送的消息的字节数

          int msgflg:            如果为0,直到发送完成函数才返回,即阻塞发送

                                       如果为IPC_NOWAIT:消息没有发送完成,函数也会返回,即非阻塞发送

返回值:成功返回0,失败返回-1

发送的格式:

struct msgbuf{

         long mtype;         //消息的类型

         char mtext[1];      //消息的内容

}

(6)msgrcv函数(接收消息) 

头文件:<sys/types.h>、<sys/ipc.h>、<sys/msg.h>

函数原型:ssize_t msgrcv(int msqid,void *msgp,size_t msgsz,long msgtyp,int msgflg)

参数:  int msqid:消息队列ID

             void *msgp:接收消息的缓冲区

             size_t msgsz:接收消息的字节数

             long msgtyp:接收消息的标识  (写0即可,0代表接收消息队列中的第一个消息)

             int msgflg: 0表示阻塞读取,IPC_NOWAIT表示非阻塞读取

返回值:成功返回接收到的消息的长度,失败返回-1 

(7)通过消息队列进行消息的发送和读取

发送消息:

#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <stdio.h>
#include <string.h>

//发送的格式:
struct msgbuf{
long mtype;
char mtext[128];
};


int main(void)
{
key_t key;
int msgid;
struct msgbuf msg;
key=ftok("./m.c",'m');
//创建消息队列
msgid=msgget(key,0666|IPC_CREAT);
if(msgid==-1)
{
printf("create msg error.\n");
return -1;
}
printf("create msg : %d successfully.\n",msgid);
//发送消息
msg.mtype=1;
strncpy(msg.mtext,"hello",5);
msgsnd(msgid,&msg,strlen(msg.mtext),0);   //第三个参数字节大小是正文的大小
return 0;
}

接收消息:

#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <stdio.h>
#include <string.h>

struct msgbuf{
long mtype;
char mtext[128];
};

int main(void)
{
key_t key;
int msgid;
struct msgbuf msg;
key=ftok("./m.c",'m');
//创建消息队列
msgid=msgget(key,0666|IPC_CREAT);
if(msgid==-1)
{
printf("create msg error.\n");
return -1;
}
printf("create msg : %d successfully.\n",msgid);
//接收消息
msgrcv(msgid,(void *)&msg,128,0,0);
printf("msg type is %ld.\n",msg.mtype);
printf("msg content is %s\n",msg.mtext);
return 0;
}



(三)命令:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1553881.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

QT QInputDialog弹出消息框用法

使用QInputDialog类的静态方法来弹出对话框获取用户输入&#xff0c;缺点是不能自定义按钮的文字&#xff0c;默认为OK和Cancel&#xff1a; int main(int argc, char *argv[]) {QApplication a(argc, argv);bool isOK;QString text QInputDialog::getText(NULL, "Input …

故障排查指南:通过连接电脑查找iOS应用崩溃日志的有效技巧

在iOS应用开发过程中&#xff0c;调试日志和奔溃日志是开发者必不可少的工具。当iOS手机崩溃时&#xff0c;我们可以连接电脑并使用Xcode Console等工具来查看日志。然而&#xff0c;这种方式可能不够方便&#xff0c;并且处理奔溃日志也相当繁琐。克魔助手的出现为开发者带来了…

推荐!00 后都在用的6个超实用微信小程序,又能少装N个app啦

在这个手机内存永远不够用的年代&#xff0c;每一次下载新app都像是在和手机进行一场心理博弈——不下载就out&#xff0c;下载了又怕手机喘不过气来。好在&#xff0c;微信小程序如同一股清流&#xff0c;轻巧地滑入我们的生活&#xff0c;解救了那些对“存储空间不足”弹窗深…

【数据结构 | 图论】如何用链式前向星存图(保姆级教程,详细图解+完整代码)

一、概述 链式前向星是一种用于存储图的数据结构&#xff0c;特别适合于存储稀疏图&#xff0c;它可以有效地存储图的边和节点信息&#xff0c;以及边的权重。 它的主要思想是将每个节点的所有出边存储在一起&#xff0c;通过数组的方式连接&#xff08;类似静态数组实现链表…

基于51单片机的汽车安全带检测控制器Proteus仿真

地址&#xff1a;https://pan.baidu.com/s/1To_ZEiJHBrZnm9ejYHFoPg 提取码&#xff1a;1234 仿真图&#xff1a; 芯片/模块的特点&#xff1a; AT89C52简介&#xff1a; AT89C52是一款经典的8位单片机&#xff0c;是意法半导体&#xff08;STMicroelectronics&#xff09;公…

Numpy 初体验

文章目录 第1关&#xff1a;Numpy 创建数组第2关&#xff1a;Numpy 数组的基本运算第3关&#xff1a;Numpy 数组的切片与索引第4关&#xff1a;Numpy 数组的堆叠第5关&#xff1a;Numpy 的拆分 第1关&#xff1a;Numpy 创建数组 编程要求 本关的任务是&#xff0c;补全右侧编辑…

查询优化-提升子查询-UNION类型

瀚高数据库 目录 文档用途 详细信息 文档用途 剖析UNION类型子查询提升的条件和过程 详细信息 注&#xff1a;图片较大&#xff0c;可在浏览器新标签页打开。 SQL: SELECT * FROM score sc, LATERAL(SELECT * FROM student WHERE sno 1 UNION ALL SELECT * FROM student…

Mybatis中QueryWrapper的复杂查询SQL

最近在使用QueryWrapper编写查询语句时发现复杂的SQL不会写。在网上找了半天&#xff0c;终于得到了点启示。在此做个记录以备忘。 我要实现的SQL是这样的&#xff1a; -- 实现这个复杂查询 -- 查询设备表 select * from oa_device where ((dev_code BSD1003 and dev_status…

系统开发实训小组作业week5 —— 用例描述与分析

目录 4.3 UC003电影浏览与查询 4.3.1 用例描述 4.3.2 活动图 4.3.3 界面元素 4.3.4 功能 4.4 UC004在线订票 4.4.1 用例描述 4.4.2 活动图 4.4.3 界面元素 4.4.4 功能 4.3 UC003电影浏览与查询 4.3.1 用例描述 用例号 UC003-01 用例名称 电影浏览与查询 用例描述…

2.9 Python缩进规则(包含快捷键)

Python缩进规则&#xff08;包含快捷键&#xff09; 和其它程序设计语言&#xff08;如 Java、C 语言&#xff09;采用大括号“{}”分隔代码块不同&#xff0c;Python采用代码缩进和冒号&#xff08; : &#xff09;来区分代码块之间的层次。 在 Python 中&#xff0c;对于类…

数据可视化为什么能在智慧港口中发挥作用?

随着全球贸易活动日益频繁&#xff0c;港口作为国际贸易的重要节点&#xff0c;其运营效率与智能化程度直接影响着整个物流链的效能。在此背景下&#xff0c;智慧港口的概念应运而生&#xff0c;它借助先进的信息技术手段对传统港口进行改造升级&#xff0c;其中&#xff0c;数…

1.Mysql基础入门—MySQL-mysql 8.0.11安装教程

1.Mysql基础入门—MySQL-mysql 8.0.11安装教程 摘要个人简介下载Mysql安装Mysql配置环境变量 摘要 MySQL 8.0.11的安装过程涉及几个关键步骤&#xff0c;首先访问MySQL官方网站下载页面&#xff0c;选择操作系统相对应的MySQL版本进行下载。对于Windows用户&#xff0c;启动下…

算法---动态规划练习-6(地下城游戏)

地下城游戏 1. 题目解析2. 讲解算法原理3. 编写代码 1. 题目解析 题目地址&#xff1a;点这里 2. 讲解算法原理 首先&#xff0c;定义一个二维数组 dp&#xff0c;其中 dp[i][j] 表示从位置 (i, j) 开始到达终点时的最低健康点数。 初始化数组 dp 的边界条件&#xff1a; 对…

主流公链 - BCH BSV BTG

为什么出现分叉 BTC是自由的&#xff0c;BTC社区也是自由的&#xff0c;自然而然的会出现不同观点的群体 1. 比特币现金&#xff08;Bitcoin Cash&#xff0c;BCH&#xff09; 分叉日期&#xff1a; 2017年8月1日主要目的&#xff1a; 提高比特币的交易吞吐量和降低交易费用技术…

简单了解原型模式

什么是原型模式 区别于单例模式&#xff0c;原型模式的一个类可以有多个实例化的对象。 原型模式通过拷贝来产生新的对象&#xff0c;而不是new&#xff0c;并且可以根据自己的需求修改对象的属性。 实现Cloneable接口实现拷贝 而拷贝又分为浅拷贝和深拷贝&#xff0c;两者在…

系统分析师-软件开发模型总结

前言 软件工程模型也称软件开发模型。它是指软件开发全部过程、活动和任务的结构框架&#xff0c;通过该模型能清晰、直观地表达软件开发全过程&#xff0c;明确地规定要完成的主要活动和任务&#xff0c;它奠定了软件项目工作的基础 一、瀑布模型&#xff08;Waterfall Model…

气象预测新篇章:Python人工智能的变革力量

Python是功能强大、免费、开源&#xff0c;实现面向对象的编程语言&#xff0c;在数据处理、科学计算、数学建模、数据挖掘和数据可视化方面具备优异的性能&#xff0c;这些优势使得Python在气象、海洋、地理、气候、水文和生态等地学领域的科研和工程项目中得到广泛应用。可以…

【娱乐】战双帕弥什游戏笔记攻略

文章目录 Part.I IntroductionChap.I Information Part.II 新手攻略Chap.I 角色和武器挑选Chap.II 新手意识推荐 Part.II 阵容搭配Chap.I 一拖二Chap.II 毕业队 Reference Part.I Introduction 2019年12月5日全平台公测。 偶然间入坑战双&#xff0c;玩了几天&#xff0c;觉得…

pbrt-v4 windows编译失败指南

cpu下编译成功很容易&#xff0c;但是gpu有点麻烦&#xff0c;主要有下面几个坑 安装optix 7&#xff0c;cmake build 要加上PBRT_OPTIX_PATH cmake cuda 版本要对应&#xff0c;不然会出现 cuda not found&#xff0c;或者generate的时候报错&#xff0c;导致最后pbrt.exe --…

如何使用固定公网地址远程连接Python编译器并将运行结果返回到Pycharm

文章目录 一、前期准备1. 检查IDE版本是否支持2. 服务器需要开通SSH服务 二、Pycharm本地链接服务器测试1. 配置服务器python解释器 三、使用内网穿透实现异地链接服务器开发1. 服务器安装Cpolar2. 创建远程连接公网地址 四、使用固定TCP地址远程开发 本文主要介绍如何使用Pych…