linux进程信号 ─── linux第27课
在 Linux 系统中,信号(Signals) 是一种进程间通信(IPC)机制,用于通知进程发生了某种事件或请求进程执行特定操作。
- 你怎么能识别信号呢?识别信号是内置的,进程识别信号,是内核程序员写的内置特性。
- 信号产⽣之后,进程知道怎么处理吗?知道。如果信号没有产生,你知道怎么处理信号吗? 知道。所以,信号的处理方法,在信号产⽣之前,已经准备好了。
- 处理信号,立即处理吗?进程可能正在做优先级更高的事情,可能不会立即处理?什么时候?合适的时候。
- 信号到来 | 信号保存 | 信号处理
- 怎么进行信号处理啊?a.默认行为 b.忽略信号 c.⾃定义行为, 后续都叫做信号捕捉。
前台进程和后台进程
./precess 在前台启动的前台进程 关闭方法:ctrl+c 杀死前台进程
./process & 在后台启动的后台进程
两种关闭方法: 1.再启动一个窗口 ,查询process的pid ,使用kill -9 pid杀死进程process
2.首先启动时使用 nohup ./process & 是将process的输出写在在nohup.out文件中,但也是后台启动
之后使用 fg 1 (1 是process的作业号)是将process改为前台进程
最后使用ctrl +c
上面的ctrl+c 实际上是OS发送2号信号SIGINT给进程process ,2号信号是终止进程
ctrl+\ 是发送3号信号SIGQUIT ,也是终止进程
查看信号
kill -l //查看linux中的常见信号
1号信号到32号信号都是普通信号(我们要学的)
查看信号的具体作用
man 7 signal //查看信号手册
其中Core和Term都是退出
Core VS Trem
Trem是正常终止进程(允许进程自行清理)
优雅终止(graceful termination):通知进程自行清理资源后退出。
Core被称为核心转储,终止进程的同时生成了 core dump 文件(记录进程崩溃时的内存状态,用于后续调试)
但是云服务器默认关闭了这个功能 ,需要系统配置才能打开此功能。
打开Core file的方法
前面进程等待时,子进程的退出时的退出信息,[7]就是core dump标志
如果子进程退出是因为执行了core且core被打开 ,这个标志位会被置为1
使用Core file
当代码量太多了,找不到哪里出了问题 core file 可以帮助我们调试程序崩溃原因
使用Core file过程
1.先将core file文件打开
2.编译可执行程序时加上 -g
3.运行可执行程序,结果崩了
4.使用gdb调试
gdb 可执行程序名称
5.在gdb中 输入 core-file core文件名
信号捕捉和更改信号的处理动作
信号也可以被捕捉,使用系统调用signal
signal只需要设置一次 ,但凡有对应的信号输入 就会被捕捉到.
捕捉到对应信号后 , 会执行第二个参数的方法,相当于改变了原先信号的执行方法
31个信号中 ,有几个信号无法被捕捉 如:9号信号
NAMEsignal - ANSI C signal handlingSYNOPSIS#include <signal.h>typedef void (*sighandler_t)(int);sighandler_t signal(int signum, sighandler_t handler);参数说明:signum:信号编号handler:函数指针,表⽰更改信号的处理动作,当收到对应的信号,就回调执⾏handler⽅法
signal函数仅仅是设置了特定信号的捕捉行为处理方式,并不是直接调用处理动作。如果后续特定信号没有产生,设置的捕捉函数永远也不会被调⽤!!
前台进程在运⾏过程中⽤⼾随时可能按下 Ctrl-C ⽽产⽣⼀个信号,也就是说该进程的⽤ ⼾空间代码执⾏到任何地⽅都有可能收到 SIGINT 信号⽽终⽌,所以信号相对于进程的控 制流程来说是异步(Asynchronous)的。
使用信号捕捉,验证上面ctrl+c OS是发送的信号是2号信号
#include <iostream>
#include <unistd.h>
#include <signal.h>void handler(int signum)
{std::cout << "我是" << getpid() << "捕捉到信号:" << signum << std::endl;
}int main()
{::signal(2,handler); //signal设置一次即可while (true){std::cout << "hello linux signal" << std::endl;sleep(1);}return 0;
}
信号的发送和接受
- 一切信号都是由OS发送给进程 因为OS是进程的唯一管理者
- 信号的接受方都是进程
- 常见信号有31个 ,进程的PCB中有一个位图,进程收到n号信号就将第n位位图由0置1 ,且进程还有一个信号函数指针数组,
- 两者对应关系: 第n信号的执行方法 = 信号函数指针数组[n-1]
信号的产生
1.键盘输入产生信号
例如:ctrl+c 就是从键盘产生2号信号 ,OS将信号发送给进程
问题: 但是OS怎么知道键盘输入数据了?
硬件中断
硬件中断(Hardware Interrupt) 是由硬件设备触发、通过硬件电路实现的机制,但其处理过程需要软件(操作系统内核)配合
硬件中断: 键盘被按下后 ,键盘发送了硬件中断给CPU ,CPU收到后会通知OS向键盘拷贝键盘数据
2.系统指令产生信号
kill -9 pid //产生了9号信号
3.系统调用产生信号
能发信号的系统调用 kill raise abort
kill不仅仅是指令 ,也是系统调用
raise 给调用此系统调用的进程发信号 相当于 kill (getpid() , signo)
abort 给进程发送6号信号 相当于 kill(getpid() ,6)
abort()
函数会向当前调用进程发送SIGABRT
信号(6号信号),默认行为是终止进程并生成核心转储(core dump)
4.软件条件产生信号
eg: 管道读端关闭 ,就产生13号信号 ,由OS发送给写端进程,杀死写端进程
eg: alarm 闹钟时间到了 ,OS发送14号进程给调用alarm的程序
alarm()
是 Linux/Unix 系统中的一个系统调用,用于设置一个定时器,在指定的秒数后向当前进程发送SIGALRM
(14号信号)。默认情况下,SIGALRM
会终止进程,但可以通过信号处理函数自定义行为。返回值:
返回之前定时器的剩余时间 ,响了返回0,没响返回剩余几秒
alarm(0)是取消闹钟 ,返回值是剩余几秒
#include <iostream>
#include <unistd.h>
#include <signal.h>int number = 0;void die(int signumber)
{printf("get a sig : %d, count : %d\n", signumber, number);exit(0);
}int main()
{// 统计我的服务器1S可以将计数器累加多少!alarm(1); // 我自己,会在1S之后收到一个SIGALRM信号signal(SIGALRM, die);while (true){number++;}}
执行结果
取消闹钟 alarm(0)
#include <iostream>
#include <unistd.h>
#include <signal.h>int number = 0;void die(int signumber)
{printf("get a sig : %d, count : %d\n", signumber, number);exit(0);
}int main()
{// 统计我的服务器1S可以将计数器累加多少!alarm(10); // 我自己,会在10S之后收到一个SIGALRM信号sleep(4);int n = alarm(0); // 0:取消闹钟std::cout << "n : " << n << std::endl;signal(SIGALRM, die);while (true){number++;}}
这里已经取消闹钟,进程不会收到14号信号,会一直执行
5.异常产生信号
野指针访问 /=0操作 都会引发信号的产生
下面演示/=0导致异常发送信号
#include <iostream> #include <unistd.h> #include <signal.h> #include<vector> #include<functional>void handler(int signum) {std::cout << "我是" << getpid() << "捕捉到信号:" << signum << std::endl; }int main() {signal(8 ,handler);int a =10;a/= 0;while(true); }
这个执行结果为什么是死循环?
上面的代码,将8号信号捕捉了,自定义的行为也没有退出进程 ,进程还在继续 ,为什么一直打印呢?
因为有众多其他进程等着执行 ,此进程时间片结束后OS将此进程在cpu寄存器上的信息记录切换其它进程 ,等OS把这个进程切回来一看 ,cpu中的寄存器还是溢出状态就还发送8号信号,一直如此
信号保存
知识补充:
相关文章:
linux进程信号 ─── linux第27课
在 Linux 系统中,信号(Signals) 是一种进程间通信(IPC)机制,用于通知进程发生了某种事件或请求进程执行特定操作。 你怎么能识别信号呢?识别信号是内置的,进程识别信号,是…...
云安全之k8s未授权漏洞总结
一、k8s介绍 全称是 kubernetes,是谷歌在2014年推出的一种开源容器编排系统,后来捐赠给了云原生计算基金会(CNCF)。因将k后面的8个字母进行缩写后,被广泛简称为K8s。随着容器技术的发展,面临着容器数量庞大…...
博客学术汇测试报告
Author:MTingle major:人工智能 Build your hopes like a tower! 目录 一.项目简介 二.开发技术 三.测试用例设计 四.自动化测试代码 common包 博客编辑 博客列表 登录页面 未登录测试 主函数 五.性能测试 六.测试总结 一.项目简介 该项目是一款基于 S…...
揭秘:父子组件之间的传递
基础知识 组件与组件之间有三大方面的知识点: 子组件通过props defineProps({})接收父组件传递到参数和方法;子组件可以通过定义 emit 事件,向父组件发送事件;父组件调用子组件通过defineExpose 导出的方法…...
leetcode 169.Majority Element
这道题虽然简单,但适合用来练习各种解法。《剑指offer》5.2节 面试题29与此题一样,并且给出了leetcode官方题解未给出的快速选择的解法。 方法一、用哈希表解决 class Solution { public:int majorityElement(vector<int>& nums) {unordered…...
魔改chromium——基础环境搭建
谷歌chromium环境要求详细文档 软件和环境要求,必须安装,硬性要求 系统环境:Windows 10,内存最小8GB,推荐16GB,NTFS格式磁盘最少100GB空间Git版本:安装最新版本即可,Git桌面端下载…...
[网络_1] 因特网 | 三种交换 | 拥塞 | 差错 | 流量控制
目录 一、网络、互连网与因特网 二、因特网发展 三、因特网的组成与功能 四、计算机网络的分类 五、因特网的标准化与意义 一、三种传输方式:电路交换 vs 报文交换 vs 分组交换 1. 电路交换(Circuit Switching)——像“打电话” 2. 报…...
android 何如查找内网设备 IP
前沿 最近在与嵌入式设备打交道,需要对设备进行配网。发现 UpnP 服务不稳定,经常收不到设备的信息。就想着能不能通过内网查找到 IP 后,直接与设备通信,不停的请求设备信息。 1.Android 端通过 UDP 组播(Multicast)查找设备 如果嵌入式设备支持 UDP 组播,Android 端可…...
Oracle数据库数据编程SQL<3.5 PL/SQL 存储过程(Procedure)>
存储过程(Stored Procedure)是 Oracle 数据库中一组预编译的 PL/SQL 语句集合,存储在数据库中并可通过名称调用执行。它们是企业级数据库应用开发的核心组件。 目录 一、存储过程基础 1. 存储过程特点 2. 创建基本语法 3. 存储过程优点 4. 简单示例 二、没有…...
六级词汇量积累day13
commend 表扬 exhaust 耗尽,用尽 weary 疲惫的,劳累的 fatigue 疲惫,劳累 obese 臃肿的,肥胖的 adopt 采纳,收养 adapt 适应 accomplish 完成,实现 accomplishment 成就 achieve 实现,完成 achi…...
蓝桥杯15届JAVA_A组
将所有1x1转化为2x2 即1x1的方块➗4 然后计算平方数 记得-1 2 import java.io.BufferedReader; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.io.PrintWriter;public class Main{static BufferedReader in new BufferedReader(new In…...
OpenCV图像输入输出模块imgcodecs(imwrite函数的用法)
《OpenCV计算机视觉开发实践:基于Python(人工智能技术丛书)》(朱文伟,李建英)【摘要 书评 试读】- 京东图书 3.2.3 imwrite保存图片 函数imwrite可以用来输出图像到文件,其声明如下: imwrite(filename,…...
win 远程 ubuntu 服务器 安装图形界面
远程结果:无法使用docker环境使用此方法 注意要写IP和:数字 在 ubuntu 服务器上安装如下: # 安装 sudo apt-get install tightvncserver # 卸载 sudo apt purge tightvncserver sudo apt autoremove#安装缺失的字体包: sudo apt update s…...
地下管线三维建模软件工具MagicPipe3D V3.6.1
经纬管网建模系统MagicPipe3D,基于二维矢量管线管点数据本地离线参数化构建地下管网三维模型(包括管道、接头、附属设施等),输出标准3DTiles、Obj模型等格式,支持Cesium、Unreal、Unity、Osg等引擎加载进行三维可视化、…...
vue子组件生命周期的执行顺序
在 Vue 中,子组件的生命周期钩子函数的执行顺序受父组件的影响,通常遵循**“先创建子组件,后创建父组件;先销毁父组件,后销毁子组件”**的原则。 1. 组件创建(挂载)阶段 当父组件挂载时&#x…...
【含文档+PPT+源码】基于微信小程序的在线考试与选课教学辅助系统
项目介绍 本课程演示的是一款基于微信小程序的在线考试与选课教学辅助系统,主要针对计算机相关专业的正在做毕设的学生与需要项目实战练习的 Java 学习者。 1.包含:项目源码、项目文档、数据库脚本、软件工具等所有资料 2.带你从零开始部署运行本套系统…...
树莓派超全系列文档--(17)树莓派配置显示器
树莓派配置显示器 显示支持 HDMI 显示器设置分辨率和旋转手动设置分辨率和旋转确定显示设备名称设置自定义分辨率设置自定义旋转 控制台分辨率和旋转 文章来源: http://raspberry.dns8844.cn/documentation 原文网址 显示 要配置 Raspberry Pi 使用非默认显示模式…...
python将pdf文件转为图片,如果pdf文件包含多页,将转化的多个图片通过垂直或者水平合并成一张图片
要将PDF文件转换为图片,并将多页PDF垂直合并成一张图片,可以使用PyMuPDF(也称为fitz)库来读取PDF文件,并使用Pillow库来处理和合并图片。以下是一个示例代码,展示了如何实现这个功能: 首先&…...
JVM基础原理
JVM是一个虚拟化的计算机,它可以执行Java字节码文件(.class文件),实现Java程序跨平台的特性。JVM负责将Java程序的字节码翻译成具体操作系统的机器码,从而能够在不同的平台上运行。JVM的核心原理涉及以下几个重要方面 …...
Miniforge3高效管理 Python环境:2025年最新实践指南
Miniforge3 高效管理 Python 环境:2025 年最新实践指南 在现代开发中,灵活高效地管理 Python 环境至关重要。Miniforge3 作为一款轻量级 Conda 管理工具,不仅默认采用更新更快的 conda-forge 软件源,还对 ARM 架构(例如 Apple M1/M2/M3)有着出色的适配性。相比于传统的 …...
31天Python入门——第17天:初识面向对象
你好,我是安然无虞。 文章目录 面向对象编程1. 什么是面向对象2. 类(class)3. 类的实例关于self 4. 对象的初始化5. __str__6. 类之间的关系继承关系组合关系 7. 补充练习 面向对象编程 1. 什么是面向对象 面向对象编程是一种编程思想,它将现实世界的概念和关系映…...
困于环中的机器人
************* c topic: 1041. 困于环中的机器人 - 力扣(LeetCode) ************* Inspect the topic first. And it looks really familiar with another robot topic. 657. 机器人能否返回原点 - 力扣(LeetCode)https://lee…...
阿里 FunASR 开源中文语音识别大模型应用示例(准确率比faster-whisper高)
文章目录 Github官网简介模型安装非流式应用示例流式应用示例 Github https://github.com/modelscope/FunASR 官网 https://www.funasr.com/#/ 简介 FunASR是一个基础语音识别工具包,提供多种功能,包括语音识别(ASR)、语音端…...
spring boot前后端开发上传文件时报413(Request Entity Too Large)错误的可能原因及解决方案
可能原因及解决方案 1. Spring Boot默认文件大小限制 原因:Spring Boot默认单文件最大为1MB,总请求体限制为10MB。解决方案: 在application.properties中配置:spring.servlet.multipart.max-file-size10MB # 单文件最大 spring…...
Transformer:破局山地暴雨预测的「地形诅咒」--AI智能体开发与大语言模型的本地化部署、优化技术
极端降雨预测的技术痛点与边缘破局 1. 传统预警系统的三重瓶颈 延迟致命:WRF模式在1km分辨率下3小时预报耗时>45分钟,错过山洪黄金响应期 地形干扰大:复杂地形区(如横断山脉)降水预测误差超50% 数据…...
游戏引擎学习第187天
看起来观众解决了上次的bug 昨天遇到了一个相对困难的bug,可以说它相当棘手。刚开始的时候,没有立刻想到什么合适的解决办法,所以今天得从头开始,逐步验证之前的假设,收集足够的信息,逐一排查可能的原因&a…...
05-02-自考数据结构(20331)- 动态查找-知识点
自考数据结构动态查找算法主要讲二叉树和平衡二叉树,但是感觉到了,就又续接了一部分,所以这篇备考的小伙伴着重看前两种就可以了。 知识拓扑 知识点介绍 二叉排序树(BST) 定义 二叉排序树(Binary Search Tree)又称二叉查找树,它或者是一棵空树,或者是具有下列性质的二…...
PyQt6实例_批量下载pdf工具_使用pyinstaller与installForge打包成exe文件
目录 前置: 步骤: step one 准备好已开发完毕的项目代码 step two 安装pyinstaller step three 执行pyinstaller pdfdownload.py,获取初始.spec文件 step four 修改.spec文件,将data文件夹加入到打包程序中 step five 增加…...
NVR接入录像回放平台EasyCVR视频融合平台城市/乡镇污水处理厂解决方案
一、方案背景 随着经济的快速发展和城市化的加快,城市污水排放量急剧增加,给城市环境和粮食安全带来了威胁。因此,污水处理厂的建设和高效运营成为对城市环境保护的重要任务。 目前,国内许多城市虽已建成污水处理系统࿰…...
Vue2 vs Vue3 生命周期全面对比:created 的进化与革新!!!
🎯 Vue2 vs Vue3 生命周期全面对比:created 的进化与革新 🔥 核心差异全景图 一、钩子函数命名与定位变化 1. 命名规范革新 Vue2 钩子Vue3 钩子 (Options API)Vue3 Composition APIbeforeCreate❌ 无setup() 替代created✅ 保留setup() 替代…...
Ubuntu 22.04安装MongoDB:GLM4模型对话数据收集与微调教程
在Ubuntu 22.04安装MongoDB Community Edition的教程请点击下方链接进行参考: 点击这里获取MongoDB Community Edition安装教程 今天将为大家带来如何微调GLM4模型并连接数据库进行对话的教程。快跟着小编一起试试吧~ 1. 大模型 ChatGLM4 微调步骤 1.1 从 github…...
并查集(Union-Find Set)课程笔记
目录 1. 并查集原理 2. 并查集的实现 3. 并查集应用 应用 1:省份数量问题 应用 2:等式方程的可满足性 1. 并查集原理 并查集用于处理需要将不同元素划分成若干不相交集合的问题。最开始时,每个元素都是单独的一个集合,随后根…...
算法刷题记录——LeetCode篇(1.4) [第31~40题](持续更新)
更新时间:2025-03-29 算法题解目录汇总:算法刷题记录——题解目录汇总技术博客总目录:计算机技术系列博客——目录页 优先整理热门100及面试150,不定期持续更新,欢迎关注! 32. 最长有效括号 给你一个只包…...
【区块链安全 | 第十四篇】类型之值类型(一)
文章目录 值类型布尔值整数运算符取模运算指数运算 定点数地址(Address)类型转换地址成员balance 和 transfersendcall,delegatecall 和 staticcallcode 和 codehash 合约类型(Contract Types)固定大小字节数组&#x…...
一款超级好用且开源免费的数据可视化工具——Superset
认识Superset 数字经济、数字化转型、大数据等等依旧是如今火热的领域,数据工作有一个重要的环节就是数据可视化。 看得见的数据才更有价值! 现如今依旧有多数企业号称有多少多少数据,然而如果这些数据只是呆在冷冰冰的数据库或文件内则毫无…...
android gradle一直编译不下来,可能是打开了gradle离线模式
gradle离线模式 当然,如果本地已经将gradle,lib都下载下来了,也可以打开这个离线模式,不然重启AS的时候可能会重新走一次下载流程...
(C语言)学生信息表(学生管理系统)(基于通讯录改版)(正式版)(C语言项目)
1.首先是头文件: //student.h //头文件//防止头文件被重复包含#pragma once//宏定义符号常量,方便维护和修改 #define ID_MAX 20 #define NAME_MAX 20 #define AGE_MAX 5 #define SEX_MAX 5 #define CLA_MAX 20 //定义初始最大容量 #define MAX 1//定义结…...
【Linux】Linux 系统启动流程详解
1. BIOS/UEFI 阶段 硬件自检(POST) BIOS/UEFI 执行硬件检查(内存、CPU、外设等)。若硬件异常,通过蜂鸣码或屏幕提示错误。 选择启动设备 按配置顺序(硬盘、U盘、网络等)寻找可引导设备。BIOS&a…...
Jetson 设备卸载 OpenCV 4.5.4 并编译安装 OpenCV 4.2.0
一、卸载 OpenCV 4.5.4 清除已安装的 OpenCV 库 sudo apt-get purge libopencv* python3-opencv # 卸载所有APT安装的OpenCV包:ml-citation{ref"1,3" data"citationList"}sudo apt autoremove # 清理残留依赖:ml-citation{ref"1,4"…...
【计算机网络】OSI七层模型完全指南:从比特流到应用交互的逐层拆解
OSI模型 导读一、概念二、模型层次结构2.1 物理层(Physical Layer)2.2 数据链路层(Data Link Layer)2.3 网络层(Network Layer)2.4 传输层(Transport Layer)2.5 会话层&…...
渗透测试:登录页面的测试-弱口令思路和实战
渗透测试:登录页面的测试思路和实战 渗透测试(Penetration Testing),也称为“渗透性测试”,是一种评估计算机系统、网络或Web应用安全性的一种方法。它通过模拟真实世界中的攻击手段和策略,来检测目标系统…...
Android BottomNavigationView 完全自定义指南:图标、文字颜色与选中状态
1. 核心功能概述 通过 Material Design 的 BottomNavigationView,你可以轻松实现以下自定义: ✅ 动态切换选中/默认图标 ✅ 自定义选中与默认文字颜色 ✅ 控制文字显示模式(始终显示/仅选中显示/自动隐藏) ✅ 添加动画和高级样…...
提示词工程
参考网站:提示工程指南 – Nextra 声明:我现在也才刚刚开始学习 人工智能,我会着重于 agent 的学习,如果有不对的地方请大家及时指出。 模型设置 前言 在向大模型发送请求时,常常能看到以下参数: {&qu…...
分页查询原理与优化方案完全指南
分页查询原理与优化方案完全指南 一、分页查询基础原理 1.1 传统分页实现方式 分页查询的核心目的是将大数据集分割成多个小块进行展示,最常见的实现方式是使用LIMIT-OFFSET语法: -- 基础分页查询 SELECT * FROM table_name ORDER BY id LIMIT page_size OFFSET (page_n…...
嵌入式软件设计规范框架(MISRA-C 2012增强版)
以下是一份基于MISRA-C的嵌入式软件设计规范(完整技术文档框架),包含编码规范、安全设计原则和工程实践要求: 嵌入式软件设计规范(MISRA-C 2012增强版) 一、编码基础规范 1.1 文件组织 头文件保护 /* 示…...
课程6. 决策树
课程6. 决策树 决策树直觉模型结构几何解释决策树的构建ID3算法信息内容标准使用决策树处理差距推广到回归问题分支标准与经典损失函数的关系 过度拟合和欠拟合欠拟合过拟合 优点和缺点案例随机生成数据集分类IRIS 数据集解决回归问题的一个简短例子 决策树 今天我们继续探索一…...
【UE5.3.2】初学1:适合初学者的入门路线图和建议
3D人物的动作制作 大神分析:3D人物的动作制作通常可以分为以下几个步骤: 角色绑定(Rigging):将3D人物模型绑定到一个骨骼结构上,使得模型能够进行动画控制。 动画制作(Animation):通过控制骨骼结构,制作出人物的各种动作,例如走路、跳跃、打斗等。 动画编辑(Ani…...
OpenCV 图形API(4)内核 API
操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 G-API 背后的核心理念是可移植性——使用 G-API 构建的流水线必须是可移植的(或者至少具备可移植的能力)。这意味着&…...
pom.xml与.yml,java配置参数传递
pom.xml与 .yml java配置参数传递 在Java项目中,通过 pom.xml 和 .yml 文件(如 application.yml)传递变量通常涉及 构建时(Maven)和 运行时(Spring Boot)两个阶段的配置。以下是具体的实现方法&…...
LeetCode算法题(Go语言实现)_21
题目 给你一个整数数组 arr,如果每个数的出现次数都是独一无二的,就返回 true;否则返回 false。 一、代码实现 func uniqueOccurrences(arr []int) bool {freq : make(map[int]int)// 统计每个数字的出现次数for _, num : range arr {freq[n…...