详讲Linux下进程等待
3.进程等待
引言:什么是进程等待
想象有两个小伙伴,一个是 “大强”(父进程 ),一个是 “小强”(子进程 )。大强给小强安排了任务,比如去收集一些石头。
1. 大强想知道小强啥时候把任务完成,就用了个办法:他跟小强说,等你干完活,记得跟我说一声。然后大强就不做别的事了(从运行状态变成阻塞状态 )在那等着小强的消息,把 CPU 让给其他小伙伴(其他就绪进程 )去用。
2.小强呢,就跑去收集石头了。等他把石头收集完(子进程完成任务并终止 ),就赶紧给大强发个信号,说 “我干完啦”。大强收到这个信号后,就从等着的状态(阻塞状态 )醒过来(变成就绪状态 ),然后 CPU 就又可以让大强接着做他后面的事啦,比如看看小强收集的石头合不合格(处理子进程的终止状态 )。
在计算机里,wait
或者 waitpid
这些函数就像是大强用来等小强消息的工具,通过它们,父进程就能等着子进程把活干完,再接着往下走 。
3.1 进程等待必要性
- 之前讲过,⼦进程退出,⽗进程如果不管不顾,就可能造成‘僵⼫进程’的问题,进⽽造成内存 泄漏。
- 另外,进程⼀旦变成僵⼫状态,那就⼑枪不⼊,“杀⼈不眨眼”的kill -9 也⽆能为⼒,因为谁也 没有办法杀死⼀个已经死去的进程。
- 最后,⽗进程派给⼦进程的任务完成的如何,我们需要知道。如,⼦进程运⾏完成,结果对还是 不对,或者是否正常退出。
- ⽗进程通过进程等待的⽅式,回收⼦进程资源,获取⼦进程退出信息.
3.2 进程等待的⽅法
3.2.1 wait⽅法
#include<sys/types.h>
#include<sys/wait.h>
pid_t wait(int* status);
返回值:
成功返回被等待进程pid,失败返回-1。
参数:
输出型参数,获取⼦进程退出状态,不关⼼则可以设置成为NULL
wait
函数的作用机制
wait
函数是一个系统调用,其作用是使父进程暂停执行,等待其子进程中的任意一个终止。当父进程调用 wait
时,内核会检查是否有已经终止的子进程。如果有,wait
会获取该子进程的终止状态信息,并返回该子进程的进程 ID,父进程继续执行后续代码;如果没有子进程终止,父进程就会被阻塞(进入睡眠状态 S),直到有子进程终止才会被唤醒并继续执行。
第一种 正常,回收⼦进程资源,获取⼦进程退出信息.
wait
函数会阻塞父进程,直到它的一个子进程终止。当子进程终止后,wait
函数返回终止子进程的进程 ID
第二种 如果等待子进程,子进程没有退出,父进程会阻塞在wait调用出吗?
在同一账户开两个窗口
while :; do ps ajx | head -1 && ps ajx | grep wlw5 ; sleep 1;done |grep -v grep
man 2 wait
3.2.2 waitpid⽅法
pid_ t waitpid(pid_t pid, int *status, int options);
返回值:
当正常返回的时候waitpid返回收集到的⼦进程的进程ID;
如果设置了选项WNOHANG,⽽调⽤中waitpid发现没有已退出的⼦进程可收集,则返回0;
如果调⽤中出错,则返回-1,这时errno会被设置成相应的值以指⽰错误所在;
参数:
pid:
Pid=-1,等待任⼀个⼦进程。与wait等效。
Pid>0.等待其进程ID与pid相等的⼦进程。
status: 输出型参数
WIFEXITED(status): 若为正常终⽌⼦进程返回的状态,则为真。(查看进程是否是正常退出)
WEXITSTATUS(status): 若WIFEXITED⾮零,提取⼦进程退出码。(查看进程的退出码)
options:默认为0,表⽰阻塞等待
WNOHANG: 若pid指定的⼦进程没有结束,则waitpid()函数返回0,不予以等待。若正常结束,则返回该⼦进程的ID。
获取id的值 ,与wait效果一样
当pid的值>0时, id+1仿造等待其进程ID与pid相等的⼦进程。
接收指定的子进程所以,导致建立的子进程变成僵尸进程🧟♀️
问题一 获取退出码
首先定义了 int status = 0;
用于存储子进程的终止状态信息。然后调用 pid_t rid = waitpid(id, &status, 0);
,其中 id
是要等待的子进程的进程 ID,&status
用于存储子进程的终止状态,0
表示默认的等待选项。
为什么返回的 为什么不是1,而是256呢?
wait和waitpid,都有⼀个status参数,该参数是⼀个输出型参数,由操作系统填充。
如果传递NULL,表⽰不关⼼⼦进程的退出状态信息。
否则,操作系统会根据该参数,将⼦进程的退出信息反馈给⽗进程。
status不能简单的当作整形来看待,可以当作位图来看待,具体细节如下图(只研究status低16
⽐特位):
可以把它当成一张位图来看,而其中整形这个变量一共32个比特位,其中高16位,低16位。
我们不管高16位,一个比特位要么0要么1,其中8-15是(退出状态码)后面的8位 全是0一旦后8位!0,异常退出,退出码毫无意义,那256就是2^8二的八次方=256。
的值正常终止的原因,如何获取呢?
(status>>8)&0xFF
:
-
子进程的终止状态信息存储在
status
变量中,它包含了多种信息。在 Linux 中,子进程正常退出时,其退出状态码存放在status
的低 8 位 。 -
status>>8
是将status
的值右移 8 位,这样原本存放在低 8 位的退出状态码就移到了最低 8 位。 -
&0xFF
是进行按位与操作,0xFF
即二进制的11111111
,与右移后的status
进行按位与操作,是为了只保留最低 8 位的值,也就是准确获取子进程的退出状态码 。通过打印这个值,可以知道子进程是以什么状态码退出的,有助于调试和了解子进程的执行结果。
问题二获取代码异常终止信号
所有信号
tatus&0x7F
:这是一个位运算表达式。在 Linux 中,子进程终止状态信息存储在 status
中,其中低 7 位(0x7F
即二进制的 01111111
)用于存储导致子进程终止的信号编号(如果子进程是因信号终止 )。通过与 0x7F
进行按位与操作,可以提取出这部分信号相关信息。如果子进程是正常退出(使用 exit
函数 ),那么这部分值为 0
;如果是因信号(如 SIGTERM
、SIGKILL
等 )终止,就能获取到对应的信号编号。
获取子进程退出码和特殊信号
刚刚在获取子进程推出码和特殊信号时,我们用的是位操作,但计算机里面的或者是它对应的为了配套的操作里面,他不想让你作为未操作提取,所以他给我们提供了若干个宏,这时候看宏它可以帮我们直接去提取
WEXITSTATUS(status)
: 若WIFEXITED⾮零,提取⼦进程退出码。(查看进程的退出码)
WIFEXITED(status):
若为正常终⽌⼦进程返回的状态,则为真,否则异常。(查看进程是否是正常退出)
阻塞调用和非阻塞调用
想象你去餐厅点餐:
-
阻塞调用:就像你点完餐后,站在柜台前一直等着服务员把做好的餐递给你,期间啥也不干,啥也做不了,只能干等着。在这个过程中,你处于 “阻塞” 状态,一直被这件事绊住 。对应到编程里,比如父进程调用
wait
函数等待子进程结束,在子进程没结束前,父进程就卡在那里,不能去做其他事,这就是阻塞调用。
上面的例子都是阻塞调用
-
非阻塞调用:类似你点餐后,没在柜台干等着,而是去旁边找个位置坐下,玩手机或者和朋友聊天。你告诉服务员做好了喊你,然后你可以同时做其他事。在编程中,像用
waitpid
函数时带上WNOHANG
选项,父进程调用后,如果子进程没结束,它不会一直卡在那,而是马上返回去做自己其他的任务,这就是非阻塞调用 。
pid_ t waitpid(pid_t pid, int *status, int options);
WNOHANG: 若pid指定的⼦进程没有结束,则waitpid()函数返回0,不予以等待。若正常结束,则返回该⼦进程的ID。
-
非阻塞调用两种情况
1.在餐厅点餐之后 ,你什么都不干,一直询问服务员好了没。‘’
2.在餐厅等服务员叫你的同时你干些事情。
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>// 定义函数指针类型
typedef void (*func_t)();#define NUM 10 // 假设函数指针数组的最大长度// 以下是任务函数定义
void Download()
{printf("我是一个下载的任务...\n");
}void Flush()
{printf("我是一个刷新的任务...\n");
}void Log()
{printf("我是一个记录日志的任务...\n");
}// 注册函数
void registerHandler(func_t h[], func_t f)
{int i = 0;for (; i < NUM; i++){if (h[i] == NULL)break;}if (i == NUM)return;h[i] = f;h[i + 1] = NULL;
}int main()
{func_t handlers[NUM] = {NULL};registerHandler(handlers, Download);registerHandler(handlers, Flush);registerHandler(handlers, Log);pid_t id = fork();if (id < 0){perror("fork");exit(EXIT_FAILURE);}if (id == 0){// 子进程int cnt = 3;while (1){sleep(3);printf("我是一个子进程,pid : %d, ppid : %d\n", getpid(), getppid());sleep(1);cnt--;if (cnt <= 0){break;}}exit(10);}// 父进程while (1){int status = 0;pid_t rid = waitpid(id, &status, WNOHANG);if (rid > 0){if (WIFEXITED(status)){printf("wait success, rid: %d, exit code: %d, exit signal: %d\n",rid, WEXITSTATUS(status), status & 0x7F);}else{printf("子进程退出异常!\n");}break;}else if (rid == 0){// 函数指针进行回调处理int i = 0;for (; handlers[i]; i++){handlers[i]();}printf("本轮调用结束,子进程没有退出\n");sleep(1);}else{perror("waitpid");break;}}return 0;
}
相关文章:
详讲Linux下进程等待
3.进程等待 引言:什么是进程等待 想象有两个小伙伴,一个是 “大强”(父进程 ),一个是 “小强”(子进程 )。大强给小强安排了任务,比如去收集一些石头。 …...
数字孪生火星探测车,星际探索可视化
运用图扑构建数字孪生火星探测车,高精度还原外观与内部构造。实时映射探测车在火星表面的移动、探测作业及设备状态,助力科研人员远程监测、分析数据,为火星探索任务提供可视化决策支持。...
《JVM考古现场(二十三):归零者·重启奇点的终极奥义》
目录 楔子:归零者文明觉醒 上卷十维弦理论破译 第一章:JVM弦论代码考古 第二章:超膜引用解析算法 第三章:量子真空涨落监控 中卷归零者心法实战 第四章:宇宙重启倒计时引擎 第五章:内存奇点锻造术 第…...
设计测试用例模板
面试时问你一个场景,要你设计测试用例,你会怎么回答? 面试官让你设计一个功能的测试用例,比如“上传文件功能”,其实就是想考你: 思维是否全面能不能抓住重点会不会分类和使用测试方法有没有考虑异常情况…...
java怎么找bug?Arthas原理与实战指南
Arthas原理与实战指南 1. Arthas简介 Arthas是阿里巴巴开源的Java诊断工具,其名字取自《魔兽世界》的人物阿尔萨斯。它面向线上问题定位,被广泛应用于性能分析、定位问题、安全审计等场景。Arthas的核心价值在于它能够在不修改应用代码、不重启Java进程…...
2024年国考
数学 一,逻辑符号表示(3 分) 1,只有获得奥运会资格的运动员才可以参加奥运会,参加奥运会的云动员不一定获奖。 设: ( Q(x) ):运动员 ( x ) 获得奥运会资格( P(x) ):运动员 ( x )…...
fastlio用mid360录制的bag包离线建图,提示消息类型错误
我用mid360录制的bag包,激光雷达的数据类型是sensor_msgs::PointCloud2,但是运行fast_lio中的mid360 launch文件,会报错(没截图),显示无法从livox_ros_driver2::CustomMsg转换到sensor_msgs::PointCloud2。…...
015-C语言字符函数和字符串函数
C语言字符函数和字符串函数 文章目录 C语言字符函数和字符串函数1. 字符分类函数2. 字符转换函数3. strlen4. strcpy5. strcat6. strcmp7. strncpy8. strncat9. strncmp10. strstr11. strtok12. strerror 1. 字符分类函数 C语言中有一系列函数是专门做字符分类的,也…...
docker 搭建nacos 2.2.1版本单机版
通过docker-compose搭建 services:nacos:image: swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/nacos/nacos-server:v2.2.1container_name: nacosenvironment:- PREFER_HOST_MODEhostname- MODEstandalone- NACOS_AUTH_ENABLEtrue- NACOS_AUTH_IDENTITY_KEYxiaogang- N…...
stack,queue和priority_queue
1. stack 1.1 stack 的介绍 栈是一种容器适配器,专门设计用于LIFO环境(后进先出),其中元素仅从容器的一端插入和提取。 容器适配器,也就是使用特定容器类的封装对象作为其底层容器,提供一组特定的成员函…...
服务治理-搭建Nacos注册中心
运行nacos.sql文件。 将准备好的nacos目录和nacos.tar包上传。 192.168.59.101是我的虚拟机ip,8848是我们设置的访问端口号。...
《Operating System Concepts》阅读笔记:p738-p747
《Operating System Concepts》学习第 63 天,p738-p747 总结,总计 10 页。 一、技术总结 1.network structure local-area networks (LAN)、wide-area networks (WAN). 2.communication structure naming and name resolution、communication proto…...
【Datawhale AI春训营】Java选手初探数据竞赛
自然语言处理基础: 自然语言处理(Natural Language Processing,NLP) 是计算机科学与人工智能领域中的一个极具挑战性和应用前景的研究方向。 它旨在使计算机能够理解、生成和处理人类的自然语言,从而实现人机高效交互。 NLP技术在搜索引擎、…...
React-useRef
如果我们想在hooks里面获同步取最新的值,那么则可以使用useRef, 关键源码如下: function mountRef<T>(initialValue: T): {|current: T|} {const hook mountWorkInProgressHook();const ref {current: initialValue};hook.memoizedState ref;re…...
得物官网sign签名逆向分析
打开得物官网,点击鞋类,可以看到请求 直接搜sign function p(e) {return f()("".concat(e ? s()(e).sort().reduce(function(t, n) {return "".concat(t).concat(n).concat(e[n])}, "") : "", "048a9…...
网络爬虫和前端相关知识
一 爬虫发展历史,概念与反爬机制 (一)爬虫发展历史 早期爬虫(1990s)起源 :早期的爬虫主要是为了构建搜索引擎。典型案例: Yahoo!人工目录 → 谷歌PageRank算法驱动的自动化爬虫。功能特点 :这些爬虫的功能比较单一,主要以抓取网页的文本内容为主,采用简单的广度优先…...
山东科技大学人工智能原理考试回忆复习资料
全部资料:https://mbd.pub/o/around_01 考试回忆版 简答题 人工智能定义 图灵测试基本思想 人工智能主要研究领域写八个以上 专家系统是什么及其特点 遗传算法流程图 综合题 语义网络表示 书上习题 证明S不满足性 用归结原理求问题 谁说真话假话的 书上例题…...
单元测试的一般步骤
Qt Test Qt Test 是 Qt 开发人员发布的一个单元测试框架,用于测试基于 Qt 框架的应用程序或库。它提供了单元测试框架中常见的所有功能以及用于测试图形用户界面的扩展。 1.自动化测试包络ui测试>接口测试>单元测试;现问如何使用Qt进行单元测试&…...
c++题目_P1443 马的遍历
P1443 马的遍历 # P1443 马的遍历 ## 题目描述 有一个 $n \times m$ 的棋盘,在某个点 $(x, y)$ 上有一个马,要求你计算出马到达棋盘上任意一个点最少要走几步。 ## 输入格式 输入只有一行四个整数,分别为 $n, m, x, y$。 ## 输出格式 …...
并发网路通信-套接字通信
套接字通信就是网络通信 在网络通信时,客户端和服务器的比例是N:1 服务器如何处理多个客户端的请求 并发处理方式 1.多线程并发处理->线程池并发处理,线程池可以对多个线程进行管理 2.多进程->进程池 3.io多路转接,使用select或者epoch进行处理,使用io转接函数…...
STM32N6如何调试下载代码
关键词:STM32N6、调试代码、开发者模式、外部Flash模式 文章目录 前言一、开发者模式调试1.1 CubeIDE调试1.2 IAR调试 二、如何下载代码(外部FLASH模式)2.1 准备工作2.2 编译下载2.2.1 Appli编译头文件下载2.2.2 FSBL编译头文件下载 2.3 运行…...
【2025】Datawhale AI春训营-蛋白质预测(AI+生命科学)-Task2笔记
【2025】Datawhale AI春训营-蛋白质预测(AI生命科学)-Task2笔记 本文对Task2使用的代码进行理解。 任务描述 Task2的任务仍然是通过对反应中包含的蛋白质残基信息,运用深度学习模型构建蛋白质3D结构的隐式模型,从而达成准确预测…...
Python基于知识图谱的医疗问答系统【附源码、文档说明】
博主介绍:✌Java老徐、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专栏推荐订阅👇&…...
Unreal 从入门到进阶 之 如何实现Pixel Streaming
文章目录 前言核心概念工作原理主要应用场景Pixel Streaming和Pixel Streaming2部署准备编辑器推流打包推流最后前言 Unreal Engine 5 (UE5) 的 Pixel Streaming 是一项基于云端的实时流媒体技术,允许将 UE5 应用的高质量图形渲染结果通过 WebRTC 协议传输到用户的浏览器或轻…...
作业2 CNN实现手写数字识别
# 导入必要库 import numpy as np import matplotlib.pyplot as plt import seaborn as sns # 用于高级可视化 from tensorflow import keras from tensorflow.keras import layers from sklearn.metrics import confusion_matrix, ConfusionMatrixDisplay import time # 用于…...
Linux驱动开发--阻塞、非阻塞I/O
2. 阻塞、非阻塞I/O IO 指的是 Input/Output,也就是输入/输出,是应用程序对驱动设备的输入/输出操作。当应用程序对设备驱动进行操作的时候,如果不能获取到设备资源,那么阻塞式 IO 就会将应用程序对应的线程挂起,直到…...
运筹学之模拟退火
目录 一、历史二、精髓思想三、案例与代码实现 一、历史 问:谁在什么时候提出模拟退火?答:模拟退火算法(Simulated Annealing,SA)是由斯图尔特柯尔斯基(Scott Kirkpatrick) 等人在 …...
JavaScript 的演变:2023-2025 年的新特性解析
随着Web技术的飞速发展,ECMAScript(简称ES)作为JavaScript的语言标准,也在不断进化。 本文将带你学习 ECMAScript 2023-2025 的新特性。 一、ECMAScript 2023 新特性 1.1 数组的扩展 Array.prototype.findLast()/Array.protot…...
CSS继承
CSS继承 CSS继承是一种机制,允许子元素自动继承父元素的某些样式属性,从而减少重复代码。 以下是一些常见的具有继承性的CSS属性: color : 文字颜色 font-family : 字体族名称 font-size : 字体大小 font-weight &am…...
游戏引擎学习第236天:GPU 概念概述
回顾并展望通过视频采集卡进行流媒体传输的未来 昨天,我们迈出了大胆的一步,决定初始化硬件的 3D 加速,因为我有点厌倦了我们的游戏没有垂直同步(vsync)。如今,在 Windows 上,我找不到一种可靠…...
HFSS3(limy)——建模学习记录
前言——笔者使用的是21版HFSS 1.基本模型 为什么没有环形的天线 2.创建基本模型方法 常用:先粗略建好模型再编辑输入准确坐标和大小尺寸(这里长方体起始点是左上角下方的点,也就是说要输入模型起点相对于坐标原点的位置尺寸就可以确定具体…...
php实现zip压缩
可以使用ZipArchive类来创建ZIP压缩文件。ZipArchive是PHP内置的一个类,提供了创建、打开、读取、写入和关闭ZIP文件的功能。 示例:压缩单个文件 <?php$fileToZip path/to/your/file.txt; $zipFileName compressed.zip;$zip new ZipArchive(); …...
【STM32单片机】#10 USART串口通信
主要参考学习资料: B站江协科技 STM32入门教程-2023版 细致讲解 中文字幕 开发资料下载链接:https://pan.baidu.com/s/1h_UjuQKDX9IpP-U1Effbsw?pwddspb 单片机套装:STM32F103C8T6开发板单片机C6T6核心板 实验板最小系统板套件科协 实验&…...
goc命令大全
颜色0黑1红2蓝3浅绿4浅蓝5淡黄6棕7深蓝8灰9粉10深绿11紫12蓝绿13黄14橙15白 绘图命令功能pen笔.fd()前进.rt()右转.c()颜色.up()抬笔.o(,)圆.e(,)椭圆.r(,,)长方形.picL(,)调图片.text(,,)文字.hide()隐藏.moveTo(,)移动wait();等待.soundL()调声音pause();暂停 绘图命令功能…...
Linux | 软件仓库管理
一. 软件包 1.1 软件包的分类 DEB:主要用于基于 Debian 的系统,如 Ubuntu。这种软件包格式具有良好的依赖管理机制,方便用户安装、升级和卸载软件。RPM:广泛应用于 Red Hat、CentOS、Fedora 等系统。RPM 包将软件打包成一个文件…...
Python实现对目标Word文档进行自动化排版【4万字精讲】(14)
前言 本文是该专栏的第14篇,后面会持续分享Python办公自动化干货知识,记得关注。 注意:本文涵盖4万字以及实战操作代码的精讲攻略,带你轻松掌握一键式“文档自动化排版”程序功能。 如果说当你在工作项目中,遇到这样的需求,需要如何处理——假设,现在有大批量的docx格…...
LeetCode每日一题4.19
2563. 统计公平数对的数目 题目 问题分析 输入:一个整数数组 nums 和两个整数 lower 和 upper。 输出:返回满足条件的公平数对的数目,即对于所有 0 < i < j < n,lower < nums[i] nums[j] < upper 的数对 (i, j)…...
Spring AI 开发 - 快速入门
先看效果 项目搭建 Spring AI 是 Spring 推出的一个项目,目标是提供统一的API抽象层,屏蔽不同AI模型和服务的底层差异,实现跨平台兼容性。 演示使用的模型是阿里的 qwq-32b。 环境要求: JDK :17以上(包括…...
leetcode哈希表(六)-三数相加
题目 15. 三数之和 给你一个整数数组 nums ,判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i ! j、i ! k 且 j ! k ,同时还满足 nums[i] nums[j] nums[k] 0 。请你返回所有和为 0 且不重复的三元组。 注意:答案中不可以包含重复…...
Photoshop安装与配置--简单攻略版
下载地址:Photoshop软件工具下载 安装完成后,即可运行Photoshop.exe;打开工具页面后,按照下面简单配置即可 1.编辑-》首选项-》常规 或者直接快捷键CtrlK 暂存盘:一定要设置为非C盘 2.性能 3.文件处理 以上配置比较基础…...
一个 CTO 的深度思考
今天和一些同事聊了一会,以下是我的观点 我的观点,成年人只能筛选,不能培养在组织中,应该永远向有结果的人看齐。不能当他站出来讲话的时候,大家还要讨论讨论,他虽然拿到结果了,但是他就是有一…...
Java:使用Maven构建项目无src解决方案
创建箭头所指的包和类以及yml文件: 类中: package com.itheima;import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication;SpringBootApplication public class BigEventApplication …...
Git 命令速查手册
听说用美图可以钓读者? 一、基础操作核心命令 1. 仓库初始化与克隆 命令作用示例git init创建新仓库git init my-projectgit clone克隆远程仓库git clone [https://github.com/user/repo.git](https://github.com/user/repo.git)git remote add关联远程仓库git re…...
office软件中word里面的编号库和列表库功能
在Microsoft Word中,编号库和列表库是两大核心排版工具,分别服务于不同层级的文档结构化需求。以下从功能定义、核心差异、应用场景及操作技巧等维度进行详细解析: 一、编号库(Numbering Library) 1. 定义与功能 编号库是Word中预设或用户自定义的有序列表格式集合,用于…...
C++入门七式——模板初阶
目录 函数模板 函数模板概念 函数模板格式 函数模板的原理 函数模板的实例化 模板参数的匹配原则 类模板 类模板的定义格式 类模板的显式实例化 当面对下面的代码时,大家会不会有一种无力的感觉?明明这些代码差不多,只是因为类型不…...
Python+Selenium+Pytest+POM自动化测试框架封装(完整版)
🍅 点击文末小卡片 ,免费获取软件测试全套资料,资料在手,涨薪更快 1、测试框架简介 1)测试框架的优点 代码复用率高,如果不使用框架的话,代码会显得很冗余。可以组装日志、报告、邮件等一…...
matlab 处理海洋数据并画图的工具包--ocean_data_tools
matlab 处理海洋数据并画图的工具包–ocean_data_tools matlab 处理海洋数据并画图的工具包–ocean_data_tools ocean_data_tools 简化了提取、格式化和可视化免费可用的海洋学数据的过程。虽然可以在线访问大量海洋学数据,但由于获取这些数据并将其格式化为可用数据…...
软件开发指南——GUI 开发方案推荐
1. LVGL (Light and Versatile Graphics Library) 适用场景:嵌入式设备、资源受限环境 优势: 专为嵌入式设计的开源 GUI 库,内存占用极小(最低仅需 64KB RAM)支持触摸屏、硬件加速(如 STM32 的 LTDC&…...
JDK8 HashMap的实现原理
一 HashMap底层存储结构 HashMap底层结构采用(数组)(链表 or 红黑树)的形式来存储节点。 首先HashMap是一个数组,而且数组里面每个位置可以放入多个元素,形象一点,咱们把数组的这些个位置称为桶…...
YOLO拓展-锚框(anchor box)详解
一.锚框(anchor box)概述 1.1什么是锚框 锚框就是一种进行预测的像素框,通过遍历输入图像上所有可能的像素框,然后选出正确的目标框,并对位置和大小进行调整就可以完成目标检测任务。 对于yolo锚框的建设须基于实际…...