linux 消息队列 msgget/msgsnd/msgrecv

news2024/11/18 16:44:43

  

  • 专栏内容:linux下并发编程
  • 个人主页:我的主页
  • 座右铭:天行健,君子以自强不息;地势坤,君子以厚德载物.

目录

前言

概述

原理

消息队列的大小

查看资源

接口

代码演示

结尾


前言

本专栏主要分享linux下并发编程相关知识,包括多进程,多线程,进程/线程间通信,并发同步控制,以及高并发下性能提升,请大家多多留言。


概述

进程间传递数据,在本专栏已经分享过共享内存,匿名/命名管道,文件映射等,今天给大家再分享一种可以通过消息包方式传递,类似于socket的方式,使用更加便捷。

原理

Linux 消息队列是一种进程间通信的机制,通过消息队列,不同进程可以彼此传递消息,实现进程间的数据共享。Linux 消息队列是一个存放消息的链表,每个消息都有一个消息类型和一个消息长度,发送方通过消息类型将消息发送到相应的消息队列中,接收方则通过消息类型从消息队列中读取相应的消息。消息队列的实现是通过内核提供的系统调用来完成的。

消息队列的大小

/proc/sys/kernel/msgmni

消息队列消息数量 MSGMNI

Linux  3.19以后默认值为32000,以前为可用内存

/proc/sys/kernel/msgmnb

消息队列最大字节数 MSGMNB

默认为16384

/proc/sys/kernel/msgmax

每个消息的最大字节数 MSGMAX

默认为8192

/proc/sys/kernel/msg_next_id

为下一个分配的IPC对象指定所需的ID

没有分配时为-1

查看资源

因为是内核资源,可以通过ipcs命令来查看已分配的消息队列,也可以查看资源限制。

[senllang@localhost msgqueue]$ ipcs -l

------ Messages Limits --------

max queues system wide = 32000

max size of message (bytes) = 8192

default max size of queue (bytes) = 16384

还有 ipcs -q查看已经有的消息队列

接口

Linux 消息队列是进程间通信中的一种方式,其中发送和接收消息的进程可以独立于消息的数据格式。在 Linux 中,消息队列由消息队列标识符、消息队列权限和消息队列中的消息组成。可以使用 msgctl()、msgget()、msgsnd() 和 msgrcv() 等函数来进行操作。其中,msgctl() 可以用于操作消息队列的权限和属性,msgget() 用于创建和访问消息队列,msgsnd() 用于将消息发送到指定消息队列,msgrcv() 则用于从消息队列中接收消息。

     消息队列涉及的头文件:

       #include <sys/types.h>

       #include <sys/ipc.h>

       #include <sys/msg.h>

       /* 获取一个System V 消息队列id */

       int msgget(key_t key, int msgflg);

    参数取值:

Key, 可以是ftok获取的,也可以是IPC_PRIVATE

msgflag, 可以取值IPC_CREAT,IPC_EXCL,还可以叠加权限进行,权限的取值与open的参数mode取值一样,只是没有可执行权限。默认指定IPC_CREAT时,没有key关联的消息队列时,就会创建,当指定IPC_EXCL时,如果不存在就会返回错误EEXIST。

        /* 发送消息 */

        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);

       调用中的flag取值 :

IPC_NOWAIT, 没有消息时立即返回;此时errno为ENOMSG。

MSG_EXCEPT,获取不是msgtyp的消息,如果队头不符合就会返回。

MSG_NOERROR,当消息超过msgsz时,会自动截断而不会报错。

/* 用于查看、设置参数,删除内核对象(用法和 shmctl 一样)*/

int msgctl(int msqid, int cmd, struct msqid_ds *buf);

     /*消息的格式,自定义消息mtype,必须大于0;后面mtext是消息数据。这里要注意,在发送时,msgsz是不包括mtype的,只是mtext的长度 */     

struct msgbuf {

               long mtype;       /* message type, must be > 0 */

               char mtext[1];    /* message data */

           };

代码演示

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

#define MAX_TEXT 512

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

int main() {
struct msgbuf buf;
int msqid;
key_t key;

if ((key = ftok(".", 123)) == -1) {
    perror("ftok");
    exit(1);
}

if ((msqid = msgget(key, 0644 | IPC_CREAT)) == -1) {
    perror("msgget");
    exit(1);
}

printf("Enter lines of text, ^D to quit:\n");
buf.mtype = 1;
while(fgets(buf.mtext, MAX_TEXT, stdin) != NULL) {
    int len = strlen(buf.mtext);

    if (buf.mtext[len-1] == '\n') buf.mtext[len-1] = '\0';

    if (msgsnd(msqid, &buf, len+1, 0) == -1) // add str end '\0'
        perror("msgsnd");
}

if (msgctl(msqid, IPC_RMID, NULL) == -1) {
    perror("msgctl");
    exit(1);
}

return 0;
}


结尾

作者邮箱:study@senllang.onaliyun.com
如有错误或者疏漏欢迎指出,互相学习。另外有什么想要了解的内容,也可以给我发邮件,互相谈讨,定知无不言。

注:未经同意,不得转载!

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

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

相关文章

Git记录

Git日常命令 版本管理 git tag 删除本地tag git tag --delete v4.2.1推送本地标签 git push origin v4.2.1创建本地标签 git tag v4.2.1 分支管理 远程仓库地址管理 远程地址添加 意外着我可以将一个项目添加多个远程的仓库地址&#xff0c;只不过需要注意的一点就是git …

mysql数据表操作

1、alter 修改表名 : alter table 旧表名 rename as 新表名添加字段 : alter table 表名 add字段名 列属性[属性]修改字段 : alter table 表名 modify 字段名 列类型[属性]alter table 表名 change 旧字段名 新字段名 列属性[属性]删除字段 : alter table 表名 drop 字段名2、…

多目标柔性生产作业车间——反世代距离(IGD)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录反世代距离IGD概念收敛性能以及分布性能举例计算反世代距离IGD概念 反世代距离是一个综合性能的评价指标&#xff0c;主要是应用至求解多目标问题中&#xff0c;评价…

Java企业级开发学习笔记(2.3)利用MyBatis实现关联查询

该文章主要为完成实训任务&#xff0c;详细实现过程及结果见【http://t.csdn.cn/ZVEZd】 文章目录一、创建数据库表1.1 创建教师表1.2 创建班级表1.3 创建学生表二、创建于数据库表对应的实体类2.1 创建教师实体类2.2 创建学生实体类2.3 创建班级实体类三、创建班级映射器配置文…

Leetcode394 字符串解码 递归和非递归

字符串解码 https://leetcode.cn/problems/decode-string/ 给定一个经过编码的字符串&#xff0c;返回它解码后的字符串。 编码规则为: k[encoded_string]&#xff0c;表示其中方括号内部的 encoded_string 正好重复 k 次。注意 k 保证为正整数。 你可以认为输入字符串总是有效…

你搞清楚了吗?| GET请求方式的长度限制到底是多少?

目录 &#x1f4cd; 浏览器限制 &#x1f4cd; 服务器限制 在大多数人的一贯认识中&#xff0c;一直认为get请求方式有2048B的长度限制&#xff0c;其实这种说法是有失偏颇的&#xff0c;甚至可以说是错误的。 这个问题一直以来似乎是被N多人误解&#xff0c;其实Http Get方…

2.3-3单链表的查找

按位查找&#xff1a; so easy (1)边界情况 i0 没有循环&#xff0c;直接返回头节点 &#xff08;2&#xff09;如果i8 当不合法&#xff0c;返回NULL. (3)普通情况i3;(平均时间复杂度为O&#xff08;n&#xff09;) 进行封装&#xff1a;避免重复&#xff0c;更加简洁更…

CRYSTALS-Dilithium

文章目录简介1和2版本区别2和3的区别1.介绍1.1基本方法概述密钥生成算法签名过程验证1.2Dilithium实现注意事项安全性。基础操作环操作模约简。元素的大小NTT域表示2.3 HashingsignatureGenζ ← {0,1}256\{{0, 1\}}^{256}{0,1}256(ρ, ρ, K) ∈ {0,1}256\{{0, 1\}}^{256}{0,1…

【springBoot篇2】springBoot日志篇

目录 一、日志有什么作用 作用1&#xff1a;快速定位问题的所在之处(最主要) 作用2&#xff1a;记录用户的登录日志 作用3&#xff1a;记录系统的操作日志 作用4&#xff1a;记录方法的执行时间 二、日志怎样使用 ①先得到日志对象(slf4j的Logger对象) ​​​编辑 ②根…

Python 无监督学习实用指南:1~5

原文&#xff1a;Hands-on unsupervised learning with Python 协议&#xff1a;CC BY-NC-SA 4.0 译者&#xff1a;飞龙 本文来自【ApacheCN 深度学习 译文集】&#xff0c;采用译后编辑&#xff08;MTPE&#xff09;流程来尽可能提升效率。 不要担心自己的形象&#xff0c;只关…

docker运行服务端性能监控系统Prometheus和数据分析系统Grafana

文章目录一、Prometheus的安装和运行1、使用docker拉取镜像2、创建prometheus.yml文件3、启动容器4、查看启动是否成功5、记录安装过程中出现的错误二、Grafana的安装和运行1、使用docker拉取镜像2、创建grafana3、运行grafana4、查看grafana运行日志5、登录grafana一、Prometh…

学会了selenium 模拟鼠标操作,你就可以偷懒点点点了

目录&#xff1a;导读 前言 01.ActionChains 类常用方法 02.ActionChains 类所有方法 03.ActionChains 使用步骤 04.实战 05.总结 前言 我们在做 Web 自动化的时候&#xff0c;有时候页面的元素不需要我们点击&#xff0c;值需要把鼠标移动上去就能展示各种信息。 这个…

云服务器开启声音的办法

云服务器开启声音的办法 淘小云 云计算从业者&#xff0c;架构师 ​关注 云服务器没有声音是一件很烦恼的事情&#xff0c;那么今天小编给大家分享一下服务器开启声音的方法&#xff01; 首先您需要先拥有一台windows系统的云服务器&#xff0c;小编这里以腾讯云服务器为例…

( “树” 之 DFS) 687. 最长同值路径 ——【Leetcode每日一题】

687. 最长同值路径 给定一个二叉树的 root &#xff0c;返回 最长的路径的长度 &#xff0c;这个路径中的 每个节点具有相同值 。 这条路径可以经过也可以不经过根节点。 两个节点之间的路径长度 由它们之间的边数表示。 示例 1: 输入&#xff1a;root [5,4,5,1,1,5] 输出&…

Loki采集Mysql errorlog,你值得拥有的错误日志聚合系统

说到分布式日志存储系统&#xff0c;大家肯定对ELK、EFK这些工具并不陌生。可是它们都基于Elasticsearch存储&#xff0c;搭建复杂&#xff0c;耗资源&#xff0c;上手难。所以&#xff0c;个人非常推崇Grafana Labs开源的Loki 轻量级日志聚合分析系统 Loki使用标签来作为索引…

java maven学习

我本身是个前端&#xff0c;目前Java都算是自学&#xff0c;为了直接能做Java服务端开发&#xff0c;我其实很多基础都没学&#xff0c;直接上项目做东西。现在来补充常用maven。避免以后出现低级错误。 一、依赖拉不下来解决步骤 1. 检查网络&#xff08;最好检查&#xff09…

Flutter(六)可滚动组件

目录1.可滚动组件简介Sliver布局模型ScrollableViewportSliver可滚动组件的通用配置2.SingleChildScrollView3.ListView默认构造函数ListView.builderListView.separated固定高度列表ListView 原理无限加载列表&#xff0c;分页添加Header4.滚动监听及控制ScrollController滚动…

SpringCloud-Alibaba学习笔记01——Nacos介绍以及注册中心的演变和Nacos核心功能

文章参考自图灵大佬课程&#xff1a;https://www.bilibili.com/video/BV1fe4y1b7ha?p1&vd_source5f425e0074a7f92921f53ab87712357b 1.什么是Nacos 官方&#xff1a;一个更易于构建云原生应用的动态服务发现(Nacos Discovery )、服务配置(Nacos Config)和服务管理平台。 …

threejs 模型 世界坐标系和设备坐标系

前言 开发中遇到需求需要点击屏幕位置处&#xff0c;生成一个类似圆形弹窗面板&#xff0c;这个交互需要进行的坐标转换为模型坐标&#xff08;局部坐标&#xff09;>场景坐标&#xff08;世界坐标&#xff09;>标准设备坐标>屏幕空间坐标&#xff0c;也就是一个将3D…

开启分片支持需要如何去做?

开启分片支持 如果您计划使您的Javashop系统数据分片&#xff0c;请参考本文档进行相应的配置。 一、做好分片策略 在开始之前&#xff0c;您应该根据自己的业务情况准备好分片策略&#xff0c;包括&#xff1a; 1、要用几个数据库来分片 2、相应的表要分几张表 在本例&#x…