进程--消息队列和共享内存

news2024/11/19 17:36:25

目录

消息队列

创建消息队列

删除消息队列

发送消息和接收


消息队列

消息队列就是一个消息的列表,进程可以在消息队列中添加消息和的读取消息
消息队列具有FIFO的特性,具有无名管道与有名管道各自的优势,可以支持任意两个进程的进程间通讯

就可以理解为打电话时,双方专属的通道

创建消息队列

创建消息队列调用 msgget 函数。消息队列需要生成密钥,理解为创建独一的电话线

函数头文件
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>

函数原型
int msgget(key_t key, int msgflg);
函数功能
获取System V消息队列标识符
[得到消息队列标识符或创建一个消息队列对象并返回消息队列标识符]
函数参数
key:由ftok函数合成
msgflg:消息队列标志
     [0:取消息队列标识符,若不存在则函数会报错]
     IPC_CREAT 创建标志
     (如果内核中不存在键值与key相等的消息队列,则新建一个消息队列;如果存在这样的消息队
列,返回此消息队列的标识符)
     [IPC_CREAT|IPC_EXCL: 如果消息队列存在,则报错, errno设置为EEXIST]
     权限控制标志
     IPC_CREAT | 0666

函数返回值
成功:返回消息队列id
失败:返回-1,并设置errno

代码:

#include <string.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#define PATHNAME "."
#define PROJ_ID 106
int main()
{
        key_t key = ftok(PATHNAME,PROJ_ID);
        if(key==-1)
       {
                perror("ftok");
                exit(EXIT_FAILURE);
       }
        int msgid = msgget(key,IPC_CREAT | 0664);
        if(msgid == -1)
       {
                perror("msgget");
                exit(EXIT_FAILURE);
       }
        printf("msgid=%d\n",msgid);
        return 0;
}

删除消息队列

删除消息队列需要调用 msgctl 函数

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

函数参数
msqid:消息队列 id
cmd:命令字
 IPC_STAT:获取消息队列属性
 IPC_SET:设置消息队列属性
 IPC_RMID:删除消息队列,用此命名时,第三个参数为NULL
buf:消息队列属性结构体对象指针

int msgid = msgget(key,IPC_CREAT | 0664);
        if(msgid == -1)
       {
                perror("msgget");
                exit(EXIT_FAILURE);
       }
        printf("msgid=%d\n",msgid);
        // 删除消息队列
        int ret = msgctl(msgid,IPC_RMID,NULL);
        if(ret == -1)
       {
                perror("msgctl");
                exit(EXIT_FAILURE);
       }
        printf("delete msg successful.\n");

发送消息和接收

发送消息队列需要调用 msgsnd 函数

函数原型
int msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg);

msqid:消息队列ID
 msgp:消息结构体指针
 msgsz:消息内容的长度
 msgflg:消息队列标志,默认可以填0,IPC_NOWAIT,可以设置非阻塞

// 发送消息
        struct msgbuf msg;
        struct msgbuf* p_msg=&msg;
        p_msg->mtype=MSG_TYPE;
        strcpy(p_msg->msgtext,"Hello,first msg.");
        int ret = msgsnd(msgid,(const void*)p_msg,strlen(p_msg-
>msgtext)+1,0);

 

接收消息调用 msgrcv 函数

ssize_t msgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp, int msgflg);

msqid:消息队列id
 msgp:消息结构指针
 msgsz:最大读取的字节数
 msgtyp:消息类型
 msgflg:消息队列标志,默认可以填0,IPC_NOWAIT,可以设置非阻塞

//接收消息
        struct msgbuf msg;
        struct msgbuf* p_msg=&msg;
        ssize_t rbytes = msgrcv(msgid,(void*)p_msg,MSG_SZ,MSG_TYPE,0);

 

 共享内存

什么是共享内存

共享内存是将分配的物理空间直接映射到进程的用户虚拟地址空间中,减少数据在内核空间缓存
共享内存是一种效率较高的进程间通讯的方式

在 Linux 系统中通过 ipcs -m 查看所有的共享内存

 创建共享内存

创建共享内存调用 shmget() 函数

函数原型
int shmget(key_t key, size_t size, int shmflg);
函数功能
创建一个共享内存,并返回ID
函数参数
 key:由 ftok() 函数返回
 size:共享内存的大小

shmflg:共享内存标志

#define PATH_NAME "."
#define PROJ_ID 110
#define SHM_SZ 1024
int main()
{
        key_t key = ftok(PATH_NAME,PROJ_ID);
        if(key == -1)
       {
                perror("ftok");
                exit(EXIT_FAILURE);
       }
        int shmid = shmget(key,SHM_SZ,IPC_CREAT|0644);

共享内存的删除

删除共享内存调用shmctl函数

int shmctl(int shmid, int cmd, struct shmid_ds *buf);

函数功能
共享内存控制函数,功能由具体的功能命令字决定

shmid:共享内存id
 cmd:控制命令字
 IPC_STAT:获取消息队列属性
 IPC_SET:设置消息队列属性
 IPC_RMID:删除消息队列属性,用此命名时,第三个参数为NULL
 buf:共享内存属性结构体指针

#define PATH_NAME "."
#define PROJ_ID 110
#define SHM_SZ 102
int main()
{
key_t key = ftok(PATH_NAME,PROJ_ID);
        if(key == -1)
       {
                perror("ftok");
                exit(EXIT_FAILURE);
       }
        int shmid = shmget(key,SHM_SZ,IPC_CREAT|0644);
        if(shmid==-1)
       {
                perror("shmget");
                exit(EXIT_FAILURE);
       }
        return 0;
}

共享内存映射与解除映射

共享内存映射调用shmat函数

void *shmat(int shmid, const void *shmaddr, int shmflg);

函数功能
将进程地址空间映射到共享内存上
函数参数
shmid:共享内存id
shmaddr:指定映射到进程地址空间的起始地址,指定为NULL时,由系统选择映射的地址
shmflg:共享内存标志,一般设置为0

解除共享映射调用 shmdt 函数

int shmdt(const void *shmaddr);

函数功能解除进程地址空间与共享内存的映射

函数参数

shmaddr:映射地址空间的起始地址

//共享内存映射
        void* addr = shmat(shmid,NULL,0);
        if(addr == (void*)-1)
       {
                perror("shmat");
                exit(EXIT_FAILURE);
       }
        char buf[1024]={0};
        memcpy(buf,addr,10);
        printf("share memory content:%s\n",buf);
        shmdt(addr); // 解除绑定   

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

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

相关文章

【python实操】python小程序之随机抽签以及for循环计算0-x的和

引言 python小程序之随机抽签以及for循环计算0-x的和 文章目录 引言一、随机抽签1.1 题目1.2 代码1.3 代码解释 二、for循环计算0-x的和2.1 题目2.2 代码2.3 代码解释 三、思考3.1 随机抽签3.2 for循环计算0-x的和 一、随机抽签 1.1 题目 使用input输入五个同学的名字随机抽取…

对于基础汇编的趣味认识

汇编语言 机器指令 机器语言是机器指令的集合 机器指令展开来讲就是一台机器可以正确执行的命令 电子计算机的机器指令是一列二进制数字 &#xff08;计算机将其转变为一列高低电平&#xff0c;使得计算机的电子器件受到驱动&#xff0c;进行运算 寄存器&#xff1a;微处理器…

zabbix7.0创建自定义模板的案例详解(以监控httpd服务为例)

前言 服务端配置 链接: rocky9.2部署zabbix服务端的详细过程 环境 主机ip应用zabbix-server192.168.10.11zabbix本体zabbix-client192.168.10.12zabbix-agent zabbix-server(服务端已配置) 创建模板 模板组直接写一个新的&#xff0c;不用选择 通过名称查找模板&#xf…

动手学深度学习(李沐)PyTorch 第 6 章 卷积神经网络

李宏毅-卷积神经网络CNN 如果使用全连接层&#xff1a;第一层的weight就有3*10^7个 观察 1&#xff1a;检测模式不需要整张图像 很多重要的pattern只要看小范围即可 简化1&#xff1a;感受野 根据观察1 可以做第1个简化&#xff0c;卷积神经网络会设定一个区域&#xff0c…

wenyan:markdown 一键转换文章排版

介绍 今天给大家介绍一个markdown排版成自媒体文章的工具。 markdown 的重要性和便捷性不用再多说&#xff0c;但是从markdown 转换到文章排版&#xff0c;我换了很多个也都很不满意&#xff0c;尤其在不支持markdown的平台&#xff0c;更是一言难尽。 本次介绍的wenyan的核心…

JDBC进阶

目录 JDBC进阶 实体类和ORM 主键回显 批量操作 连接池 介绍 常见的连接池 Druid连接池 Hikari连接池 连接池与软编码 其他配置 Druid配置 Hikari配置 JDBC进阶 实体类和ORM 在使用JDBC操作数据库时会发现数据都是零散的&#xff0c;明明在数据库中是一行完整的数…

【四】Spring Cloud OpenFeign原理分析

Spring Cloud OpenFeign原理分析 概述 Spring Cloud 微服务实践也有挺多年了&#xff0c;一直想着总结一下这系列的知识点&#xff0c;最近终于下定决心来出一个Spring Cloud 系列文章了。本文主要围绕fegin组件来进行讲解&#xff0c;文中将会给出基础使用的示例&#xff0c;还…

0x10 用友 畅捷通T+ RecoverPassword.aspx 管理员密码修改漏洞

参考&#xff1a; 用友 畅捷通T RecoverPassword.aspx 管理员密码修改漏洞 | PeiQi文库 (wgpsec.org) 免责声明 欢迎访问我的博客。以下内容仅供教育和信息用途&#xff1a; 合法性&#xff1a;我不支持或鼓励非法活动。请确保遵守法律法规。信息准确性&#xff1a;尽管我尽…

全站最详细的Python环境配置步骤

1、官网下载IDE JetBrains下载 2、IDE下载、安装步骤 这里展示的是如何在Windows上下载、安装Pycharm工具&#xff0c;Linux的步骤类似。 2.1、选择开发者工具 选择开发者工具 2.2、选择Pycharm 选择Pycharm 2.3、选择下载 选择下载 2.4、选择社区版 一般而言&#xff…

【STM32-HAL库】AHT10温湿度传感器使用(STM32F407ZGT6配置i2c)(附带工程下载连接)

一、温湿度传感器&#xff1a; 温湿度传感器是一种能够检测环境中的温度和湿度&#xff0c;并将其转化为电信号输出的装置。它在智能家居、工业自动化、气象监测、农业等领域有着广泛的应用。 原理&#xff1a; 温湿度传感器通常基于不同的物理原理&#xff0c;以下是一些常见…

补:vs调试技巧!

目录 1>>闲话 2>>bug 3>>debug调式 4>>debug和release 5>>监视和内存观察 6>>总结 1>>闲话 数据结构章节在国庆后再给大家更喔&#xff0c;现在先把c基础打好&#xff0c;所以我又重返回去学习c语言&#xff0c;并且&#xff0…

17 vue3之tsx手写vite tsx插件

我们之前呢是使用Template去写我们模板。现在可以扩展另一种风格TSX风格 vue2 的时候就已经支持jsx写法&#xff0c;只不过不是很友好&#xff0c;随着vue3对typescript的支持度&#xff0c;tsx写法越来越被接受&#xff0c;减少我们学习react的成本 Ant Design组件库就是使用…

利用LLMs自动寻找量化投资策略

利用LLMs自动寻找量化投资策略 J.P.Morgan的python教程 Content 本文提出了一个利用大型语言模型&#xff08;LLMs&#xff09;和多代理架构的新框架&#xff0c;用于量化股票投资和投资组合管理。该框架通过整合LLMs生成多样化的alpha因子&#xff0c;并动态评估市场条件&am…

基于 QAnything 的知识库问答系统:技术解析与应用实践

最近已有不少大厂都在秋招宣讲了&#xff0c;也有一些在 Offer 发放阶段。 节前&#xff0c;我们邀请了一些互联网大厂朋友、今年参加社招和校招面试的同学。 针对新手如何入门算法岗、该如何准备面试攻略、面试常考点、大模型技术趋势、算法项目落地经验分享等热门话题进行了…

Mysql 学习——项目实战

MySQL 学习——项目实战 项目出处 博主&#xff1a;Asmywishi Linux-Ubuntu启动Mysql sudo mysqlData preparation Create Database and Table Create database : create database mysql_example1;Start database : use mysql_example1;Create Student table : # 学生表…

vue页面保持在div的底部(适用于聊天界面等需要显示最新信息的场景)

代码示例&#xff1a; <script setup lang"ts"> import {nextTick, onMounted, ref} from vueconst count [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, …

如何将题目文档做成一个题库刷题小程序?

✨告别题海战术&#xff0c;迎接智慧刷题新时代&#xff01;&#x1f680; &#x1f4da;面对堆积如山的题库文档&#xff0c;是否感到无从下手&#xff1f;别担心&#xff0c;这款本土定制刷题小程序来救场啦&#xff01;&#x1f389; &#x1f31f;自动生成题库&#xff0c…

数据结构-3.9.栈在递归中的应用

一.函数被调用背后的过程&#xff1a;最后被调用的函数最先结束也符合栈的后进先出 1.main函数为主函数即程序入口&#xff0c;运行时主函数先入栈&#xff0c;然后存入主函数里的数据&#xff1b; 2.func1函数加载在栈中时他后面的代码的地址#1(调用返回地址&#xff0c;不是…

Xshell7下载及服务器连接

一、Xshell-7.0.0164p、Xftp 7下载 1.1、文件下载 通过网盘分享的文件&#xff1a;xshell 链接: https://pan.baidu.com/s/1qc0CPv4Hkl19hI9tyvYZkQ 提取码: 5snq –来自百度网盘超级会员v2的分享 1.2、ip连接 下shell和xftp操作一样&#xff1a;找到文件—》新建—》名称随…

链表OJ经典题目及思路总结(一)

目录 前言1.移除元素1.1 链表1.2 数组 2.双指针2.1 找链表的中间结点2.2 找倒数第k个结点 总结 前言 解代码题 先整体&#xff1a;首先数据结构链表的题一定要多画图&#xff0c;捋清问题的解决思路&#xff1b; 后局部&#xff1a;接着考虑每一步具体如何实现&#xff0c;框架…