springboot篇

news2024/9/22 5:42:11

文章目录

  • 1.题目问答
  • 2.配置详情
    • 2.1配置文件
    • 2.2多环境配置
    • 2.3自定义参数
    • 2.4命令行参数
    • 2.5加载顺序
  • 3.Starter POMs
  • 4.监控与管理—actuator
    • 4.1. 应用配置类
      • 4.1.1./autoconfg
      • 4.1.2. /beans
      • 4.1.3. /configprops
      • 4.1.4 /env
      • 4.1.5./mappings
      • 4.1.6./info
    • 4.2. 度量指标类
      • 4.2.1. /metrics
      • 4.2.2. /health
      • 4.2.3./dump
      • 4.2.3./trace
    • 4.3 操作控制类


1.题目问答

Spring Boot的宗旨是希望通过设计大量的自动化配置等方式来简化 Spring 原有样板化的配置,使得开发者可以快速构建应用。除了解决配置问题之外,Spring Boot 对于构建、部署等做了优化,Spring Boot还通过一系列Starter POMs的定义,让我们整合各项功能的时候,不需要在Maven的pom.xml中维护那些错综复杂的依赖关系,而是通过类似模块化的 Starter 模块定义来引用,使得依赖管理工作变得更为简单。
在如今容器化大行其道的时代,Spring Boot除了可以很好融入Docker之外,其自身就支持嵌入式的 Tomcat、Jetty 等容器。所以,通过 Spring Boot 构建的应用不再需要安装Tomcat,将应用打包成war,再部署到 Tomcat 这样复杂的构建与部署动作,只需将 SpringBoot 应用打成jar 包,并通过 java -jar 命令直接运行就能启动一个标准化的 Web 应用,这使得 Spring Boot 应用变得非常轻便。
1.启动 Spring Boot 应用的方式:

  • 作为一个 Java 应用程序,可以直接通过运行拥有 main 函数的类来启动。
  • 在 Maven 配置中,之前提到了 spring-boot插件,可以使用它来启动,比如执行 mvn spring-boot:run命令,或是直接单击IDE中对 Maven 插件的工具,例如Intelli]中的支持:
    在这里插入图片描述
  • 在服务器上部署运行时,通常先使用mvn insta11将应用打包成jar 包,再通过
    java -jar xxx.jar 来启动应用。

2.配置详情

2.1配置文件

src/main/resources目录是Spring Boot 的配置目录,默认的配置文件位置为src/main/resources/application.properties。关于 Spring Boot 应用的配置内容都可以集中在该文件中,比如定义容器端口号、数据库连接信息、日志级别等各种配置信息。
Spring Boot 的配置文件除了可以使用传统的properties文件之外,还支持现在被广泛推荐使用的 YAML 文件。YAML可以通过使用 spring.profiles属性来定义多个不同的环境配置。
注意 YAML目前还有一些不足,它无法通过@PropertySource 注解来加载配置。但是,YAML 将属性加载到内存中保存的时候是有序的,所以当配置文件中的信息需要具备顺序含义时,YAML的配置方式比起 properties 配置文件更有优势。

2.2多环境配置

对于多环境的配置,在 Spring Boot 中,多环境配置的文件名需要满足 application-{profile}.properties的格式,其中{profile}对应你的环境标识,如下所示。

  • application-dev.properties:开发环境。
  • application-test.properties:测试环境。
  • application-prod.properties:生产环境。
    至于具体哪个配置文件会被加载,需要在 application.properties 文件中通过spring.profiles.active 属性来设置,其值对应配置文件中的{profile}值。如spring.profiles.active=test 就会加载application-test.properties 配置文件内容。

2.3自定义参数

可以在配置文件 application.properties中定义一些我们需要的自定义属性。然后,在应用中可以通过@Value 注解来加载这些自定义的参数。
@Value 注解加载属性值的时候可以支持两种表达式来进行配置,如下所示

  • 一种是上面介绍的 PlaceHolder 方式,格式为${…},大括号内为 PlaceHolder。
  • 另一种是使用 SpEL表达式(SpringExpressionLanguage),格式为#{…},大括号内为 SpEL 表达式。
    **参数引用:**在 application.properties中的各个参数之间可以直接通过使用PlaceHolder 的方式来进行引用。
    使用随机数:在 Spring Boot 的属性配置文件中,可以通过使用${random}配置来产生随机的 int 值、long 值或者 string 字符串,这样我们就可以容易地通过配置随机生成属性,而不是在程序中通过编码来实现这些逻辑。
${random}的配置方式主要有以下几种,读者可作为参考使用。
com.didispace.blog.value=${random.value}#随机字符串
com.didispace.blog.number=${random.int}#随机 int
com.didispace.blog.bignumber=${random.long }#随机 long
com.didispace.blog.test1=${random.int(10)}# 10 以内的随机数
com.didispace.blog.test2=${random.int[10,20]}# 10~20的随机数

2.4命令行参数

可以在命令行中指定应用的参数,比如java-jarxxx.jar–server.port=8888,连续的两个减号–就是对application.properties中的属性值进行赋值的标识。

2.5加载顺序

Spring Boot 使用了下面这种较为特别的属性加载顺序:
1.在命令行中传入参数
2.SPRING_APPLICATION_JSON中的属性。SPRING_APPLICATION_JSON是以JSON格式配置在系统环境变量中的内容。
3.java:comp/env中的JNDI 属性。
4.Java的系统属性,可以通过 System.getProperties()获得的内容。
5.操作系统的环境变量。
6.通过 random.*配置的随机属性。
7.位于当前应用jar包之外,针对不同{profile}环境的配置文件内容,例如application-{profile}.properties 或是YAML 定义的配置文件。
8.位于当前应用jar包之内,针对不同{profile}环境的配置文件内容,例如application-{profile}.properties 或是 YAML 定义的配置文件。
9.位于当前应用jar 包之外的 application.properties 和 YAML 配置内容
10.位于当前应用jar 包之内的 application.properties 和 YAML 配置内容。
11.在@Configuration 注解修改的类中,通过@PropertySource 注解定义的属性。
12.应用默认属性,使用 SpringApplication.setDefaultProperties 定义的内容。
优先级按上面的顺序由高到低,数字越小优先级越高。
可以看到,其中第7项和第9项都是从应用iar包之外读取配置文件,所以,实现外部化配置的原理就是从此切入,为其指定外部配置文件的加载位置来取代jar 包之内的配置内容。通过这样的实现,我们的工程在配置中就变得非常干净,只需在本地放置开发需要的配置即可,而不用关心其他环境的配置,由其对应环境的负责人去维护即可。

3.Starter POMs

Spring Boot 的 Starter POMs采用 spring-boot-starter-*的命名方式,*代表一个特别的应用功能模块,比如web、test。

4.监控与管理—actuator

监控系统采集信息有很大一部分指标都是类似的,比如环境变量、垃圾收集信息、内存信息、线程池信息等。
Spring Boot在 Starter POMs 中提供了一个特殊依赖模块 spring-boot-starter-actuator。引入该模块能够自动为 Spring Boot 构建的应用提供一系列用于监控的端点。包括原生提供的端点以及一些常用的扩展和配置方式等。
在pom.xml中添加依赖

<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

根据端点的作用,原生端点分为以下三类:

  • 应用配置类:获取应用程序中加载的应用配置、环境变量、自动化配置报告等与Spring Boot 应用密切相关的配置类信息。
  • 度量指标类:获取应用程序运行过程中用于监控的度量指标,比如内存信息、线程池信息、HTTP请求统计等。
  • 操作控制类:提供了对应用的关闭等操作类功能。

4.1. 应用配置类

由于 Spring Boot 为了改善传统 Spring 应用繁杂的配置内容,采用了包扫描和自动化配置的机制来加载原本集中于XML文件中的各项内容。虽然这样的做法让我们的代码变得非常简洁,但是整个应用的实例创建和依赖关系等信息都被离散到了各个配置类的注解上,这使我们分析整个应用中资源和实例的各种关系变得非常困难。而这类端点可以帮助我们轻松获取一系列关于 Spring 应用配置内容的详细报告,比如自动化配置的报告、Bean 创建的报告、环境属性的报告等。

4.1.1./autoconfg

/autoconfg:该端点用来获取应用的自动化配置报告,其中包括所有自动化配置的候选项。同时还列出了每个候选项是否满足自动化配置的各个先决条件。所以,该端点可以帮助我们方便地找到一些自动化配置为什么没有生效的具体原因。该报告内容将自动化配置内容分为以下两部分。

  • positiveMatches中返回的是条件匹配成功的自动化配置。
  • negativeMatches中返回的是条件匹配不成功的自动化配置。

4.1.2. /beans

/beans:该端点用来获取应用上下文中创建的所有Bean。
在每个Bean中都包含了下面这些信息

  • bean:Bean的名称。
  • scope:Bean的作用域。
  • type:Bean的Java类型
  • resource:class文件的具体路径
  • dependencies:依赖的Bean 名称。

4.1.3. /configprops

/configprops:该端点用来获取应用中配置的属性信息报告。prefix属性代表了属性的配置前缀,properties代表了各个属性的名称和值。可以通过该报告来看到各个属性的配置路径,可以通过使用endpoints.configprops.enabled=false来关闭该端点。

4.1.4 /env

**/env:**该端点与/confgprops不同,它用来获取应用所有可用的环境属性报告。包括环境变量、JVM 属性、应用的配置属性、命令行中的参数。它可以帮助我们方便地看到当前应用可以加载的配置信息,并配合@ConfigurationProperties注解将它们引入到我们的应用程序中来进行使用。另外,为了配置属性的安全,对于一些类似密码等敏感信息,该端点都会进行隐私保护,但是我们需要让属性名中包含 password、secret、key 这些关键词,这样该端点在返回它们的时候会使用*来替代实际的属性值。

4.1.5./mappings

**/mappings:**该端点用来返回所有 Spring MVC的控制器映射关系报告。bean属性标识了该映射关系的请求处理器,method属性标识了该映射关系的具体处理类和处理函数。

4.1.6./info

/info:该端点用来返回一些应用自定义的信息。默认情况下,该端点只会返回一个空的 JSON 内容。我们可以在 application.properties 配置文件中通过 info前缀来设置一些属性,比如下面这样:

info.app.name-spring-boot-hello
info.app.version=v1.0.0

再访问/info端点,我们可以得到下面的返回报告,其中就包含了上面我们在应用中自定义的两个参数。

{
	"app":{
	"name":"spring-boot-hello"
	"version":"v1.0.0"
	}
}

4.2. 度量指标类

应用配置类端点所提供的信息报告在应用启动的时候就已经基本确定了其返回内容,可以说是一个静态报告。而度量指标类端点提供的报告内容则是动态变化的,这些端点提供了应用程序在运行过程中的一些快照信息,比如内存使用情况、HTTP请求统计、外部资源指标等。这些端点对于我们构建微服务架构中的监控系统非常有帮助。

4.2.1. /metrics

/metrics:该端点用来返回当前应用的各类重要度量指标,比如内存信息、线程信息垃圾回收信息等。包含以下度量值:

  • 系统信息:包括处理器数量processors、运行时间uptime和instance.uptime、系统平均负载systemload.average。
  • mem.*:内存概要信息,包括分配给应用的总内存数量以及当前空闲的内存数量。这些信息来自java.lang.Runtime。
  • heap.*:堆内存使用情况。这些信息来自java.lang.management.MemoryMXBean 接口中getHeapMemoryUsage 方法获取的 java.lang.management.MemoryUsage.
  • nonheap.*:非堆内存使用情况。这些信息来自java.lang.managementMemoryMXBean接口中getNonHeapMemoryUsage方法获取的java.lang.management.MemoryUsage.
  • threads.*:线程使用情况,包括线程数、守护线程数(daemon)、线程峰值(peak)等,这些数据均来自java.lang.management.ThreadMXBean。
  • classes.*:应用加载和卸载的类统计。这些数据均来自java.lang.management.ClassLoadinqMxBean。
  • gc.*:垃圾收集器的详细信息,包括垃圾回收次数gc.ps scavenge.count、垃圾回收消耗时间 gc.ps scavenge.time、标记-清除算法的次数 gc.psmarksweep.count、标记-清除算法的消耗时间gc.ps marksweep.time。这些数据均来自java,lang.management.GarbageCollectorMXBean。
  • httpsessions.*:Tomcat容器的会话使用情况。包括最大会话数httpsessions.max和活跃会话数httpsessions.active。该度量指标信息仅在引入嵌入式 Tomcat 作为应用容器的时候才会提供。
  • gauge.*:HTTP请求的性能指标之一,它主要用来反映一个绝对数值。比如上面示例中的 gauge.response.hello:5,它表示上一次hello 请求的延迟时间为5 毫秒。
  • counter.*:HTTP请求的性能指标之一,它主要作为计数器来使用,记录了增加量和减少量。上述示例中的counter.status.200.hello:11,它代表了 he1lo请求返回 200状态的次数为11。
    对于 gauge.*和counter.*的统计,这里有一个特殊的内容请求star-star,它代表了对静态资源的访问。这两类度量指标非常有用,我们不仅可以使用它默认的统计指标,还可以在程序中轻松地增加自定义统计值。只需要通过注入org.springframework.boot.actuate.metrics.CounterService 和 orgspringframework.boot.actuate.metrics.GaugeService 来实现自定义的统计指标信息。比如我们可以像下面这样自定义实现对hello接口的访问次数统计。
@RestController
public class HelloController{
	@Autowired
	private CounterService counterService;
	@RequestMapping("/hello")
	public String greet(){
		counterService.increment("didispace.hello.count");
		return "";
	}
}

/metrics端点可以提供应用运行状态的完整度量指标报告,这项功能非常实用,但是对于监控系统中的各项监控功能,它们的监控内容、数据收集频率都有所不同,如果每次都通过全量获取报告的方式来收集,略显粗暴。所以,我们还可以通过/metrics/{name}接口来更细粒度地获取度量信息,比如可以通过访问/metrics/mem.free来获取当前可用内存数量。

4.2.2. /health

/health:用来获取应用的各类健康指标信息。在 spring-boot-starter-actuator 模块中自带实现了一些常用资源的健康指标检测器。这些检测器都通过 HealthIndicator接口实现,并且会根据依赖关系的引入实现自动化装配,比如下面列出的这些。

检测器功能
DiskSpaceHealthIndicator低磁盘空间检测
DataSourceHealthIndicator检测 DataSource 的连接是否可用
MongoHealthIndicator检测 Mongo 数据库是否可用
RabbitHealthIndicator检测 Rabbit 服务器是否可用
RedisHealthIndicator检测 Redis 服务器是否可用
SolrHealthIndicator检测 Solr 服务器是否可用
有时候,我们可能还会用到一些 Spring Boot的 Starter POMs 中还没有封装的产品来进行开发,比如,当使用 RocketMQ 作为消息代理时,由于没有自动化配置的检测器,所以需要自己来实现一个用来采集健康信息的检测器。我们可以在 Spring Boot 的应用中,为org.springframework.boot.actuate.health.HealthIndicator 接口实现一个对 RocketMQ的检测器类:
@Component
public class RocketMQHealthIndicator implements HealthIndicator{
	@Override
	public Health health(){
		int errorCode=check();
		if(errorCode !=0){
			return Health.down().withDetail("Error Code", errorCode) .build();
		}
			return Health.up().build();
		private int check(){
		//对监控对象的检测操作
		}
	}

通过重写 health()函数可实现健康检查,在返回的Heath 对象中,共有两项内容,一个是状态信息,除了该示例中的UP与DOWN之外,还有UNKNOWN和OUT_OF_SERVICE,可以根据需要来实现返回;还有一个详细信息,采用Map的方式存储,在这里通过withDetail函数,注入了一个Error Code 信息,我们也可以填入其他信息,比如,检测对象的IP地址、端口等。重新启动应用,并访问/health接口,我们在返回的JSON字符串中,将会包含如下信息:

"rocketMQ" :{"status": "UP"}

4.2.3./dump

/dump:该端点用来暴露程序运行中的线程信息。它使用java.lang.management
ThreadMxBean的dumpAllThreads方法来返回所有含有同步信息的活动线程详情。

4.2.3./trace

**/trace:**该端点用来返回基本的HTTP 跟踪信息。默认情况下,跟踪信息的存储采用org.springframework.boot.actuate.trace.InMemoryTraceRepository实现的内存方式,始终保留最近的100条请求记录。

4.3 操作控制类

操作控制类端点拥有更强大的控制能力,如果要使用它们的话,需要通过属性来配置开启操作。
在原生端点中,只提供了一个用来关闭应用的端点:/shutdown。可以通过如下配置开启它:endpoints.shutdown.enabled=true
在配置了上述属性之后,只需要访问该应用的/shutdown端点就能实现关闭该应用的远程操作。由于开放关闭应用的操作本身是一件非常危险的事,所以真正在线上使用的时候,需要对其加入一定的保护机制,比如定制actuator 的端点路径、整合 Spring Security 进行安全校验等。

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

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

相关文章

Linux终端简单配置(Vim、oh-my-zsh和Terminator)

文章目录 0. 概述1. 完整Vim配置2. Vim配置方案解释2.1 状态行与配色方案2.2 文件管理与缓存设置2.3 搜索与导航优化2.4 缩进与格式化设置2.5 粘贴模式快捷切换2.6 文件编码与格式2.7 性能优化与备份 3. 安装 Oh My Zsh 及配置3.1 安装 Oh My Zsh3.2 Oh My Zsh 配置 3. Termina…

谷歌seo为什么要分析对手?

​简单来说&#xff0c;找到差距&#xff0c;弥补差距&#xff0c;提升网站 通过观察对手的网站内容、关键词策略和外链情况&#xff0c;是可以知道很多重要信息的&#xff0c;只要能熟练运用各种seo工具&#xff0c;通过分析对手网站是可以帮助优化自己网站的&#xff0c;研究…

进阶SpringBoot之 Shiro(2)环境搭建

Spring Boot 创建 Web 项目&#xff0c;pom.xml 导入 Thymeleaf 依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-thymeleaf</artifactId></dependency> resources 目录下 templates 包新…

VastBase——数据库参数调优

一、内存参数调优 数据库的复杂查询语句性能非常强的依赖于数据库系统内存的配置参数。数据库系统内存的配置参数主要包括逻辑内存管理的控制参数和执行算子是否下盘的参数&#xff1a; 1.逻辑内存管理参数&#xff1a;max_process_memory max_process_memory – shared memo…

SQL Server Profiler 工具的使用

在很多时候&#xff0c;我们需要优化接口的执行效率&#xff0c;一方面是提高代码在内存中的执行效率&#xff0c;另一方面就是提高数据库操作相关的效率了。 .NET中在System.Diagnostics类库下提供了Stopwatch类用来分析代码的执行耗时。那么如果是牵扯到数据库相关的操作&am…

前端速通面经八股系列(一)—— CSS篇

CSS高频面经目录 一、CSS基础1. CSS选择器及其优先级2. CSS中可继承与不可继承属性有哪些3. display的属性值及其作用4. display的block、inline和inline-block的区别5. 隐藏元素的方法有哪些6. link和import的区别7. transition和animation的区别8. display:none与visibility:…

Beyond Compare 4试用过期规避办法

声明: 支持正版软件 一: 注册表处理 在搜索栏中输入 regedit &#xff0c;打开注册表 删除项目&#xff1a;计算机\HKEY_CURRENT_USER\Software\ScooterSoftware\Beyond Compare 4\CacheId 二: 脚本处理 创建bat文件, 写入下面的命令行. reg delete “HKEY_CURRENT_USER\…

华为od全面介绍!!!

三分钟带你全面了解华为OD 【合同及管理】签约方为科锐国际/外企德科&#xff08;人力服务公司&#xff09;&#xff0c;劳动合同期为4年&#xff0c;试用期6个月。员工关系合同管理、五险一金、考勤发薪由科锐国际/外企德科负责&#xff1b;定级定薪、员工培训、工作安排、绩…

Redis的配置和启动+Redis Insight连接

一、安装 Redis的安装&#xff1a;从镜像站下载&#xff1a;索引 redis-local (huaweicloud.com)&#xff0c;然后将其传到Linux虚拟机中进行解压&#xff0c;解压之后需要下载gcc&#xff0c;因为Redis底层是用c写的&#xff0c;所以要编译一下生成redis文件&#xff0c;然后…

人工智能领域正经历模型规模变革,小型语言模型(SLM)崛起,挑战“规模至上”观念。

在人工智能领域&#xff0c;一场关于模型规模的深刻变革正在悄然发生。长久以来&#xff0c;科技巨头们热衷于庞大语言模型&#xff08;LLM&#xff09;的开发竞赛&#xff0c;但如今&#xff0c;小型语言模型&#xff08;SLM&#xff09;正以其独特的优势逐步崭露头角&#xf…

麦弗逊悬架KC特性分析APP开发与应用

汽车悬架系统是汽车重要的组成部分之一&#xff0c;起到支撑车身、减震降噪、提高行驶稳定性等多种作用。其中&#xff0c;悬架系统的K&C特性是一个重要指标&#xff0c;直接影响到汽车的操纵稳定性和乘坐舒适性&#xff0c;是悬架系统设计和优化的关键目标之一。 图1 汽车…

font-face 字体设置

摘要: font-face是css3中允许使用自定义字体的一个模块。 font-face的是一个CSS规则&#xff0c;允许你输入自己的字体出现在网站上&#xff0c;即使在特定的字体在访问者的计算机上没有安装。这条规则最重要的是&#xff0c;它为设计师打开了一个全新的世界。您可以使用任何你…

不平衡分类的成本敏感学习

不平衡分类的成本敏感学习 大多数机器学习算法都假设模型所犯的所有错误分类错误都是相同的。 对于不平衡分类问题&#xff0c;情况通常并非如此&#xff0c;因为遗漏正类或少数类案例比错误地将示例归类为负类或多数类更糟糕。有许多现实世界的例子&#xff0c;例如检测垃圾…

高效好用的10个自动化办公库分享

高效可用的10个自动化办公库 10个常用的Python自动化办公库本次内容涵盖了Excel、Word、PPT、ODF、PDF、邮件、微信、文件处理等所有能在办公场景实现自动化的库&#xff0c;希望能够对大家有所帮助。 PythonExcel自动化库 1.xlwings 库官网&#xff1a;https://www.xlwings…

用 Python 解锁电影台词中的秘密:给孩子一个学英语的新奇方式

引言 想象一下&#xff1a;孩子们不仅在看他们喜欢的电影&#xff0c;还能从中学到新的英语单词&#xff01;有没有什么比这更有趣、更高效的学习方式&#xff1f;在这篇博客中&#xff0c;我将带你一步步搭建一个 Python 工具&#xff0c;从电影台词中提取单词并生成详细的词…

06:网表更新到PCB

1.先了解HDMI设计规范 有4对差分线&#xff0c;1对IIC串行总线信号从芯片---->防静电器件—>HDMI输出 发现错误&#xff0c;没有SDA网络&#xff0c;检查原理图 重新导网表 3.完成信号芯片—>防静电模块—>HDMI布局

PMP–知识卡片--迭代型生命周期

迭代指的是多次循环。例如&#xff0c;软件开发按照版本发布&#xff0c;每一个版本内部都是一个小的瀑布开发&#xff0c;都会经历“需求分析—设计—开发—测试—发布”周期&#xff0c;下一个迭代在此基础上重复这些步骤&#xff0c;对软件进行优化升级&#xff0c;发布新的…

用友U8接口-自定义项和扩展自定义项(6)

概括 本文的操作需要正确部署U8API保存单据时传入自定义项和扩展自定义项 单据自定义项 ERP界面 接口参数 自定义项为标准erp字段&#xff0c;以cDefine开始的字段对应接口传入参数位置 [{"Inum": "OtherIn","Data": {"iHead": {&…

和星辰为伴,与代码共舞

大家好&#xff0c;我是小悟 在探索数字编织的浩瀚宇宙中&#xff0c;独立开发者犹如孤独的星际航行者&#xff0c;驾驶着创意与技术的飞船&#xff0c;穿梭于代码的无垠星海。 他们的日常工作&#xff0c;是一幅由无数个日夜辛勤耕耘编织而成的壮丽画卷&#xff0c;每一笔都…

进程通信——共享内存

文章目录 1.基本认识1.1 概念介绍1.2主要原理 2.使用方法2.1创建共享内存shmget2.1.1 shmget2.1.2 ftok 2.2映射地址空间shmat2.3 访问共享内存2.4 同步和互斥 3.接口封装3.1 创建shm_create3.2 映射shm_connect3.3 多进程共享内存 共享内存是一种机制&#xff0c;也是进程间进…