多进程间通信学习之共享内存

  • 共享内存:
  • 1、在内核中创建共享内存;
  • 2、进程1和进程2都能够访问到,通过这段内存空间进行数据传递;
  • 3、共享内存是所有进程间通信方式中效率最高不需要在内核中往返进行拷贝
  • 4、共享内存的内存空间大小是4KB的整数倍
  • 常用的接口函数:
  • 一、创建共享内存(shmget函数):
	#include <sys/ipc.h>#include <sys/shm.h>int shmget(key_t key, size_t size, int shmflg);/*参数:key:键值key 通过ftok获取IPC_PRIVATE:只能用于亲缘进程间的通信size:共享内存的大小  PAGE_SIZE(4k)的整数倍shmflg:共享的标志位IPC_CREAT|0666 或 IPC_CREAT|IPC_EXCL|0666返回值:成功 共享内存编号失败 -1 重置错误码*/
  • 二、映射共享内存到当前的进程空间(shmat函数):
	#include <sys/ipc.h>#include <sys/shm.h>void *shmat(int shmid, const void *shmaddr, int shmflg);/*参数:shmid:共享内存编号shmaddr:NULL,让系统自动分配shmflg:共享内存操作方式0    		  读写SHM_RDONLY    只读返回值:成功 指向共享内存的地址失败 (void *)-1 重置错误码*/
  • 三、取消地址映射(shmdt函数):
	#include <sys/ipc.h>#include <sys/shm.h>int shmdt(const void *shmaddr);/*参数:shmaddr:指向共享内存的指针返回值:成功 0失败 -1 重置错误码*/
  • 四、控制共享内存(shmctl函数):
	#include <sys/ipc.h>#include <sys/shm.h>int shmctl(int shmid, int cmd, struct shmid_ds *buf);/*参数:shmid:共享内存编号cmd:操作的命令码IPC_STAT:获取IPC_SET:设置IPC_RMID:删除共享内存标记要销毁的段。实际上,只有在最后一个进程将其分离之后 (关联结构shmid_ds的shm_nattch成员为零时), 段才会被销毁。调用者必须是段的所有者或创建者,或具有特权。buf参数被忽略。buf:共享内存属性结构体指针返回值:成功 0失败 -1 重置错误码*/
  • 示例代码:
  • 写端:
	#include <stdio.h>#include <stdlib.h>#include <string.h>#include <sys/types.h>#include <sys/ipc.h>#include <sys/shm.h>#include <unistd.h>#define PIGE_SIZE 4*1024int main(int argc, char const *argv[]){//获取键值key_t key = ftok("/home/linux/work/MSG", 'k');if(-1 == key){perror("ftok error");exit(1);}//创建共享内存int shmid = shmget(key, 2*PIGE_SIZE,IPC_CREAT|0666);if(-1 == shmid)\{perror("shmget error");exit(1);}//映射共享内存char *sh_addr = (char *)shmat(shmid, NULL, 0);if((void *) -1 == sh_addr){perror("shmat error");exit(1);}//向共享内存中写入数据while(1){fgets(sh_addr,128,stdin);sh_addr[strlen(sh_addr)-1] = '\0';if(!strncmp(sh_addr,"quit",4)){break;}}//取消映射if(-1 == shmdt(sh_addr)){perror("shmdt error");exit(1);}//删除共享内存if(-1 == shmctl(shmid, IPC_RMID, NULL)){perror("shmctl error");exit(1);}return 0;}
  • 读端:
	#include <stdio.h>#include <stdlib.h>#include <string.h>#include <sys/types.h>#include <sys/ipc.h>#include <sys/shm.h>#include <unistd.h>#define PIGE_SIZE 4*1024int main(int argc, char const *argv[]){//获取键值key_t key = ftok("/home/linux/work/MSG", 'k');if(-1 == key){perror("ftok error");exit(1);}//创建共享内存int shmid = shmget(key, 2*PIGE_SIZE,IPC_CREAT|0666);if(-1 == shmid)\{perror("shmget error");exit(1);}//映射共享内存char *sh_addr = (char *)shmat(shmid, NULL, 0);if((void *) -1 == sh_addr){perror("shmat error");exit(1);}while(1){sleep(2);//防止刷屏printf("%s\n",sh_addr);if(!strncmp(sh_addr,"quit",4)){break;}}//取消映射if(-1 == shmdt(sh_addr)){perror("shmdt error");exit(1);}//删除共享内存if(-1 == shmctl(shmid, IPC_RMID, NULL)){perror("shmctl error");exit(1);}return 0;}
  • 运行结果:
	linux@ubuntu:~/work/MSG$ gcc w3.c -o w3linux@ubuntu:~/work/MSG$ ./w3hihellochinaquitlinux@ubuntu:~/work/MSG$ gcc r3.c -o r3linux@ubuntu:~/work/MSG$ ./r3hihihihellochinachinachinaquitshmctl error: Invalid argument
  • 注意:
  • 不按4k的整数倍给shmget传参,分配时也是按4k的整数倍分配

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

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

相关文章

prometheus简介

什么是Prometheus Prometheus 是一个开源的服务监控系统和时序数据库&#xff0c;其提供了通用的数据模型和快捷数据采集、存储和查询接口。Prometheus的特点 多维数据模型&#xff1a;由度量名称和键值对标识的时间序列数据 时序数据&#xff0c;是在一段时间内通过重复测量&…

数据结构之---- 动态规划

数据结构之---- 动态规划 什么是动态规划&#xff1f; 动态规划是一个重要的算法范式&#xff0c;它将一个问题分解为一系列更小的子问题&#xff0c;并通过存储子问题的解来避免重复计算&#xff0c;从而大幅提升时间效率。 在本节中&#xff0c;我们从一个经典例题入手&am…

Web5:互联网发展的下一个前沿

最近发现了互联网的下一代发展“Web5”&#xff0c;这激起了我分享我对此的见解的兴趣。自 1993 年互联网诞生以来&#xff0c;它已经发生了很大的变化&#xff0c;为我们带来了大量很酷的应用程序&#xff0c;让我们的生活每天都变得更加美好。我们的想法是让互联网的使用变得…

盛最多水的容器

给定一个长度为 n 的整数列表 height 。有 n 条垂线&#xff0c;第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。找出其中的两条线&#xff0c;使得它们与 x 轴共同构成的容器可以容纳最多的水。返回容器可以储存的最大水量。 说明&#xff1a;你不能倾斜容器。 示例1&…

Python基础01-环境搭建与输入输出

零、文章目录 Python基础01-环境搭建与输入输出 1、Python概述 &#xff08;1&#xff09;为什么要学习Python 技术趋势&#xff1a;Python自带明星属性&#xff0c;热度稳居编程语言界前三 简单易学&#xff1a;开发代码少&#xff0c;精确表达需求逻辑&#xff1b;33个关…

什么是Maven?

什么是Maven 1、Maven是依赖管理、项目构建工具。 pom.xml springBoot项目的核心配置文件&#xff0c;pom项目对象模型、Dependency依赖管理模型。 Maven中的GAVP是指&#xff1a; 1、GroupId&#xff1a;当前工程组织id&#xff0c;例如&#xff1a;com.jd.tddl 2、ArtifactI…

IS-IS原理与配置

IS-IS原理与配置 • IS-IS&#xff08;Intermediate System to Intermediate System&#xff0c;中间系统到中间系统&#xff09;是ISO &#xff08;International Organization for Standardization&#xff0c;国际标准化组织&#xff09;为它的CLNP &#xff08;ConnectionL…

[ 8 种有效方法] 如何在没有备份的情况下恢复 Android 上永久删除的照片?

我们生命中最重要的时刻&#xff0c;但这样做有缺点&#xff0c;其中之一就是数据丢失的风险。您可能倾向于定期删除无意义的照片&#xff0c;同时保存可爱的照片&#xff0c;从而使您的 Android 设备井井有条。然而&#xff0c;有些人在删除自己珍视的图像时不小心犯了错误。您…

非递归方式遍历二叉树的原理

一、递归遍历代码 // 先序遍历 void PreOrder(BiTNode *T){if (T!NULL){visit(T); // 最简单的visit就是printf(T->data)PreOrder(T->lChild);PreOrder(T->rChild);} }// 中序遍历 void InOrder(BiTNode *T){if (T!NULL){InOrder(T->lchild);visit(T);InOrder(T-…

2312,生成编译命令

compile_commands.json包含各个目录的编译命令,它的生成: cmake: -DCMAKE_EXPORT_COMPILE_COMMANDSON;gn: gn gen . --export-compile-commandsninja ninja -t compdb cxx cc>compile_commands.json生成sphinx文档. 进入doc目录. 然后输入make html,然后等待即可!

Linux---文本搜索命令

1. grep命令的使用 命令说明grep文本搜索 grep命令效果图: 2. grep命令选项的使用 命令选项说明-i忽略大小写-n显示匹配行号-v显示不包含匹配文本的所有行 -i命令选项效果图: -n命令选项效果图: -v命令选项效果图: 3. grep命令结合正则表达式的使用 正则表达式说明^以指…

什么是PHP中的变量作用域?

PHP中的变量作用域&#xff08;variable scope&#xff09;指的是变量在代码中可访问的区域或范围。PHP支持多种变量作用域&#xff0c;包括以下几种主要类型&#xff1a; 全局作用域&#xff08;Global Scope&#xff09;&#xff1a; 在全局作用域中声明的变量可以在脚本的任…

单片机上位机(串口通讯C#)

一、简介 用C#编写了几个单片机上位机模板。可定制&#xff01;&#xff01;&#xff01; 二、效果图

SCI一区级 | Matlab实现GWO-CNN-GRU-selfAttention多变量多步时间序列预测

SCI一区级 | Matlab实现GWO-CNN-GRU-selfAttention多变量多步时间序列预测 目录 SCI一区级 | Matlab实现GWO-CNN-GRU-selfAttention多变量多步时间序列预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 1.Matlab实现GWO-CNN-GRU-selfAttention灰狼算法优化卷积门控循环…

你如何看待“前端已死”

随着人工智能和低代码的崛起&#xff0c;“前端已死”的声音逐渐兴起。前端已死&#xff1f;尊嘟假嘟&#xff1f;快来发表你的看法吧&#xff01; 一、你如何看待“前端已死” 对于Java是否已经死亡以及前端是否已经凉凉&#xff0c;我认为这样的说法是不准确的。 首先&#…

【Unity】2D项目中如何让Camera展示的大小正好等于某一个Game Object的大小

【背景】 用Unity做工具软件的话希望Camera大小正好和界面Panel一致。 【方法一:手动调整】 相机设置成正交后手动调整边框,当然这种方法精确度不高。 【方法二:在Camera上追加如下脚本】 这里面的public变量里面拖放你想要对齐的目标对象即可。 using UnityEngine;pu…

大数据HCIE成神之路之数据预处理(2)——异常值处理

异常值处理 1 异常值处理1.1 散点图1.1.1 实验任务1.1.1.1 实验背景1.1.1.2 实验目标1.1.1.3 实验数据解析 1.1.2 实验思路1.1.3 实验操作步骤1.1.4 结果验证 1.2 基于分类模型的异常检测1.2.1 实验任务1.2.1.1 实验背景1.2.1.2 实验目标1.2.1.3 实验数据解析 1.2.2 实验思路1.…

深入了解Linux网络配置:常见面试问题及解答

学习目标&#xff1a; 解释Linux网络配置的重要性和作用引入常见的面试问题 学习内容&#xff1a; 如何查看当前系统的IP地址和网关信息&#xff1f; 解答&#xff1a;可以使用ifconfig命令来查看当前系统的IP地址和网关信息。通过运行ifconfig命令&#xff0c;将会列出所有可…

Flink系列之:WITH clause

Flink系列之&#xff1a;WITH clause 适用流、批提供了一种编写辅助语句以在较大查询中使用的方法。这些语句通常称为公共表表达式 (CTE)&#xff0c;可以被视为定义仅针对一个查询而存在的临时视图。 WITH 语句的语法为&#xff1a; WITH <with_item_definition> [ , …