Linux:进程(二)
目录
一、cwd的理解
二、fork的理解
1.代码共享
2.各司其职
3.fork的返回值
三、进程状态
1.进程排队
2.进程状态
运行状态
阻塞状态
挂起状态
一、cwd的理解
cwd(current working directory)。译为当前工作目录。
在C语言中,使用fopen函数打开文件时,第一个参数为当前目录下的某个文件的文件名,那么如何理解“当前目录”。
我们已经知道在/proc目录下,以文件的形式存放着每一个进程。
需要注意的是,只有当一个可执行程序被执行后,对应的进程文件才会在/proc目录下出现。
[euto@VM-4-13-centos 24915]$ ./myprocess
i am a process! id: 3800,fid: 2963
i am a process! id: 3800,fid: 2963
i am a process! id: 3800,fid: 2963
i am a process! id: 3800,fid: 2963
···········
同时在/proc目录下,出现一个进程目录3800。
[euto@VM-4-13-centos 24915]$ ls /proc
1 16 264 36 560 acpi kallsyms scsi
10 170 265 3647 562 buddyinfo kcore self
1005 17110 269 37 563 bus keys slabinfo
1071 18 27 3721 568 cgroups key-users softirqs
1074 1825 275 376 575 cmdline kmsg stat
1077 19 28 38 6 consoles kpagecount swaps
11 196 28150 3800 637 cpuinfo kpageflags sys
1100 2 285 4 638 crypto loadavg sysrq-trigger
1196 20 28704 400 639 devices locks sysvipc
12 21 28720 403 640 diskstats mdstat timer_list
1206 22 28721 407 641 dma meminfo timer_stats
1207 23 29 4452 65 driver misc tty
1218 23737 290 46 671 execdomains modules uptime
1219 24 291 48 7 fb mounts version
13 25 2959 49 8 filesystems mtrr vmallocinfo
1347 259 2962 50 9 fs net vmstat
1354 25995 2963 51 9648 interrupts pagetypeinfo xpmem
1373 26 30772 516 9684 iomem partitions zoneinfo
14 262 3123 5375 9802 ioports sched_debug
14075 263 35 5421 9803 irq schedstat
我们可以查看进程3800的目录。
[euto@VM-4-13-centos 24915]$ ll /proc/3800
total 0
dr-xr-xr-x 2 euto euto 0 Sep 18 10:20 attr
-rw-r--r-- 1 euto euto 0 Sep 18 10:20 autogroup
-r-------- 1 euto euto 0 Sep 18 10:20 auxv
-r--r--r-- 1 euto euto 0 Sep 18 10:20 cgroup
--w------- 1 euto euto 0 Sep 18 10:20 clear_refs
-r--r--r-- 1 euto euto 0 Sep 18 10:17 cmdline
-rw-r--r-- 1 euto euto 0 Sep 18 10:20 comm
-rw-r--r-- 1 euto euto 0 Sep 18 10:20 coredump_filter
-r--r--r-- 1 euto euto 0 Sep 18 10:20 cpuset
lrwxrwxrwx 1 euto euto 0 Sep 18 10:17 cwd -> /home/euto/linux/24915
-r-------- 1 euto euto 0 Sep 18 10:17 environ
lrwxrwxrwx 1 euto euto 0 Sep 18 10:17 exe -> /home/euto/linux/24915/myprocess
dr-x------ 2 euto euto 0 Sep 18 10:17 fd
dr-x------ 2 euto euto 0 Sep 18 10:20 fdinfo
-rw-r--r-- 1 euto euto 0 Sep 18 10:20 gid_map
-r-------- 1 euto euto 0 Sep 18 10:20 io
·······················
需要注意两个信息,exe所指向的就是该进程对应的可执行程序所在目录。
这里还有一个信息就是cwd,不难总结出来,cwd和进程是深深绑定的,换句话说,我们平时说讲的“当前目录”,其实就是和进程绑定的cwd。因此,在C语言中使用fopen打开当前目录下某个文件的操作,其实就是可执行程序运行起来后,对应的进程中cwd所指目录下的某个文件。
下面对这个结论作验证,通过执行指令chdir来演示,chdir的功能用来改变当前的工作目录。
CHDIR(2) Linux Programmer's Manual CHDIR(2)NAMEchdir, fchdir - change working directorySYNOPSIS#include <unistd.h>int chdir(const char *path);int fchdir(int fd);
······
修改源文件为以下内容。
[euto@VM-4-13-centos 24915]$ cat myprocess.c
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
int main()
{printf("当前进程pid:%d\n",getpid());printf("修改目录前\n");sleep(30);printf("修改目录后\n");chdir("/home/euto/");sleep(30);FILE* fp = fopen("test.txt","w");fclose(fp);return 0;
}
演示结果应该为:修改目录前,cwd为当前文件所在的目录24915。修改目录后,cwd更改为/home/euto,执行fopen打开文件test.txt时,由于test.txt文件并不存在,所以新建一个文件test.txt,新建文件所在的目录是/home/euto。
[euto@VM-4-13-centos 24915]$ ./myprocess
当前进程pid:16846
修改目录前
[euto@VM-4-13-centos 24915]$ ll /proc/16846
total 0
dr-xr-xr-x 2 euto euto 0 Sep 18 10:43 attr
-rw-r--r-- 1 euto euto 0 Sep 18 10:43 autogroup
-r-------- 1 euto euto 0 Sep 18 10:43 auxv
-r--r--r-- 1 euto euto 0 Sep 18 10:43 cgroup
--w------- 1 euto euto 0 Sep 18 10:43 clear_refs
-r--r--r-- 1 euto euto 0 Sep 18 10:43 cmdline
-rw-r--r-- 1 euto euto 0 Sep 18 10:43 comm
-rw-r--r-- 1 euto euto 0 Sep 18 10:43 coredump_filter
-r--r--r-- 1 euto euto 0 Sep 18 10:43 cpuset
lrwxrwxrwx 1 euto euto 0 Sep 18 10:43 cwd -> /home/euto/linux/24915
-r-------- 1 euto euto 0 Sep 18 10:43 environ
lrwxrwxrwx 1 euto euto 0 Sep 18 10:43 exe -> /home/euto/linux/24915/myprocess
dr-x------ 2 euto euto 0 Sep 18 10:43 fd
dr-x------ 2 euto euto 0 Sep 18 10:43 fdinfo
·······
程序执行chdir修改目录后。
[euto@VM-4-13-centos 24915]$ ./myprocess
当前进程pid:16846
修改目录前
修改目录后
[euto@VM-4-13-centos 24915]$ ll /proc/16846
total 0
dr-xr-xr-x 2 euto euto 0 Sep 18 10:43 attr
-rw-r--r-- 1 euto euto 0 Sep 18 10:43 autogroup
-r-------- 1 euto euto 0 Sep 18 10:43 auxv
-r--r--r-- 1 euto euto 0 Sep 18 10:43 cgroup
--w------- 1 euto euto 0 Sep 18 10:43 clear_refs
-r--r--r-- 1 euto euto 0 Sep 18 10:43 cmdline
-rw-r--r-- 1 euto euto 0 Sep 18 10:43 comm
-rw-r--r-- 1 euto euto 0 Sep 18 10:43 coredump_filter
-r--r--r-- 1 euto euto 0 Sep 18 10:43 cpuset
lrwxrwxrwx 1 euto euto 0 Sep 18 10:43 cwd -> /home/euto
-r-------- 1 euto euto 0 Sep 18 10:43 environ
lrwxrwxrwx 1 euto euto 0 Sep 18 10:43 exe -> /home/euto/linux/24915/myprocess
dr-x------ 2 euto euto 0 Sep 18 10:43 fd
········
查看/home/euto目录,发现test.txt文件新建在了这个目录,和预期符合。
[euto@VM-4-13-centos 24915]$ ls /home/euto/
linux test.txt
二、fork的理解
运行man fork查看fork的相关介绍。
FORK(2) Linux Programmer's Manual FORK(2)NAMEfork - create a child processSYNOPSIS#include <unistd.h>pid_t fork(void);
fork这个函数用来创建一个子进程。
父进程和子进程的关系:一个父进程可以有多个子进程,而一个子进程的父进程是唯一的。
fork的返回值介绍。
RETURN VALUEOn success, the PID of the child process is returned in the parent,
and 0 is returned in the child. On failure, -1 is returned in the parent,
no child process is created, and errno is set appropriately.
子进程创建失败,返回负数。
子进程创建成功,给父进程返回子进程的pid,给子进程返回0。(pid都是大于0的整数)
1.代码共享
- 结论:使用fork创建子进程后,父进程和子进程共享代码。
解释:
在目录24918下编辑源文件myprocess.c的内容。
[euto@VM-4-13-centos 24918]$ cat myprocess.c
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
int main()
{printf("fork之前:i am a process ,pid:%d,ppid:%d",getpid(),getppid());fork();printf("fork之后:i am a process ,pid:%d,ppid:%d",getpid(),getppid());return 0;
}
运行结果显示。
[euto@VM-4-13-centos 24918]$ ./myprocess
fork之前:i am a process ,pid:16709,ppid:6682
fork之后:i am a process ,pid:16709,ppid:6682//父进程
fork之后:i am a process ,pid:16710,ppid:16709//子进程
第二句printf被打印了两次的原因是,父进程和子进程分别进行了打印。在执行fork这个函数后,子进程就已经在内存中存在了,子进程和父进程指向同一个可执行程序,在fork函数后需要执行的代码被父子进程共享。
其中,一条打印结果的ppid是另一条打印结果的pid,说明这是父子进程。
关于子进程的PCB,大部分内容和父进程相同。
关于共享的可执行程序,代码和数据都只有一份。
2.各司其职
- 结论:一般而言,父进程和子进程完成的功能是不同的,源文件的代码只有一份,但是通过条件判断语句让父进程和子进程可以实现不同的功能。
解释:编辑源文件myprocess.c的内容如下。
int main()
{printf("fork之前i am a process,pid:%d ,ppid:%d\n",getpid(),getppid());sleep(5);printf("开始创建子进程\n");pid_t id = fork();if(id < 0){return 1;}else if(id == 0){//子进程while(1){printf("fork之后,我是子进程,pid:%d,ppid:%d,id:%d\n",getpid(),getppid(),id);sleep(1);}}else{//父进程while(1){printf("fork之后,我是父进程,pid:%d,ppid:%d,id:%d\n",getpid(),getppid(),id);sleep(1);}}return 0;
}
运行结果如下。
[euto@VM-4-13-centos 24918]$ ./myprocess
fork之前i am a process,pid:32557 ,ppid:30035
开始创建子进程
fork之后,我是父进程,pid:32557,ppid:30035,id:32570
fork之后,我是子进程,pid:32570,ppid:32557,id:0
fork之后,我是父进程,pid:32557,ppid:30035,id:32570
fork之后,我是子进程,pid:32570,ppid:32557,id:0
fork之后,我是父进程,pid:32557,ppid:30035,id:32570
fork之后,我是子进程,pid:32570,ppid:32557,id:0
fork之后,我是父进程,pid:32557,ppid:30035,id:32570
fork之后,我是子进程,pid:32570,ppid:32557,id:0
······
程序运行成功后,父进程和子进程执行各自的代码,但是源文件的代码在内存中只有一份,数据也是只有一份。
如果子进程在执行的过程中修改某一个变量,实际上并不是修改变量本来的内存空间,而是在修改之前,完成一个“写时拷贝”的操作,拷贝一份新的空间用来给子进程操作,父进程也是如此。
3.fork的返回值
- 为什么fork返回时,给父进程返回子进程的pid,给子进程返回0?
如果作为子进程,只需要调用getppid即可获取到父进程,因为父进程是唯一的;如果作为父进程,是没有办法直接获取到子进程的pid的,因为子进程不唯一,可以有多个。
- fork给两个进程返回了不同的值,众所周知,函数不可能返回两个值,因此,可以判断,fork函数返回了两次,那么fork是如何返回两次的?
我们假设这是fork函数的函数体。
在return语句之前,fork处理创建子进程相关的操作,且执行return这一行代码之前,子进程就已经被创建出来并活跃在内存中,return语句的本质就写入到不同的进程,可以看作是特殊的返回,执行两次return分别返回到不同的进程中。
- 源代码中的id是一个变量,为什么一个变量可以有两个值?
操作系统在设计进程的时候,就保证了进程之间是彼此独立的,互相不影响。且利用了虚拟内存等其他技术,使得在Linux下,用一个变量表示了不同的内存空间。
编写一次创建多个进程的源程序,代码如下。
const int num = 10;
void worker()
{int cnt = 10;while(cnt){printf("child %d is running,cnt:%d\n",getpid(),cnt);--cnt;sleep(1);}
}
int main()
{for(int i =0;i < num; ++i){pid_t id = fork();if(id<0){break;}if(id == 0){worker();exit(0);}printf("父进程成功创建子进程,id:%d\n",id);sleep(1);}sleep(10);return 0;
}
三、进程状态
1.进程排队
- 为什么存在进程排队这样的现象?
进程出现了排队,一定是在等待某个资源,毕竟硬件资源有限。
- 进程不是一直在运行的。进程在CPU上,也不是一直在运行的。
比如,当程序执行到scanf这一行的时候,程序在等待键盘的输入,即在等待硬件资源(也可能是软件资源),因此进程不是一直在运行的。
在CPU上,由于时间片的设计,CPU也不是一直在运行同一个进程。
- 进程=PCB + 可执行程序,所谓的进程排队是可执行程序在排队还是PCB在排队?
排队一定是利用了队列这种数据结构,那么单位类型是可执行程序的话消耗将会巨大无比,因此涉及排队,都是利用队列对PCB作排队。
- 不难发现,一个task_struct,既要利用链表这种数据结构,又要利用队列这种数据结构,那么底层是怎么实现的呢,是存储两份数据吗?
并不是下面这样的实现。
而是在task_struct内部封装链表结点或者队列结点,因此一个task_struct可以被链入到多个数据结构中。
那么,在已知listnode地址的情况下,如何操作task_struct其他数据呢,这就和偏移量有关。
2.进程状态
进程的三种状态:运行,阻塞,挂起。
- 状态是什么
本质上,就是task_struct中的一个整型变量。
struct task_struct
{int status;····
}
用整型变量表示不同的状态就类似define定义。
#define new 1
#define ready 2
#define running 3
#define block 4
·····
- 设计状态这一个属性的意义。
通过进程的状态来决定下一步进程要做的动作。
运行状态
一个CPU对应一个运行队列。当进程在运行队列中排队时,即为运行状态。
阻塞状态
操作系统管理硬件,先是利用面向对象来定义结构体,再用数据结构组织管理,大致是下面这样。
//struct是面向对象思想
struct device
{设备名设备操作方法设备状态链表结点//链表结点是数据结构思想
}
如果一个进程正在运行队列中被CPU执行,但是该程序内部如果有像scanf这样的函数,需要等待硬件资源的获取,那么操作系统会把这个进程从运行队列中弹出来,然后把PCB状态修改为阻塞状态。紧接着,由于每一个硬件设备都像CPU一样有着一个队列,用来排队需要提供资源的进程。
struct device
{设备名设备操作方法设备状态链表结点等待队列的结点
}
比如scanf需要键盘的资源,那么这个进程的PCB就会被链入到键盘的等待队列,这种状态就是阻塞状态。
当进程获取到资源后,操作系统作为硬件的管理者,捕获到这一讯息,再将PCB的阻塞状态修改为运行状态,链入到CPU的运行队列。
也可以总结出来,所谓的PCB状态发生变化,本质就是PCB被链入到不同的队列。
挂起状态
进程变成挂起状态的情况相对较少。
挂起状态有一个前提,当计算机的软硬件资源有限的时候,进程可能变为挂起状态。
比如,某一个进程正在键盘中阻塞,但是内存或者其他设备的资源同时十分有限,计算机已经十分卡顿,如果继续让这个进程占用资源,可能引起操作系统的崩溃,因此,操作系统把这个进程相关的指令、数据(注意PCB不会被写入到硬盘),暂时写入到硬盘中,变成暂时挂起的状态。
PCB由阻塞状态变成的挂起状态,称为阻塞挂起。
磁盘上专门有一个分区,用来在内存资源有限的时候,进行数据、代码的写入写出操作,这个分区就是swap分区,swap分区一般是内存大小的一半,最好不要超过内存大小的两倍。
- 从另一个角度理解挂起时PCB不会被写入到磁盘:我们知道进程 = PCB + 加载到内存中的可执行程序。那么,进程在被创建之前,是先创建PCB还是先把可执行程序加载到内存?
答案是先创建PCB。操作系统用PCB管理程序,而有些大型游戏的可执行程序大小多达80GB,内存只有16GB大小,不可能全部加载到内存中,而是在创建完成PCB后,将部分数据加载到内存中,部分加载到swap分区,部分可能还在磁盘中,没有被调度到,但是操作系统仍然优秀地管理着这个可执行程序,原因就在于操作系统管理着PCB,而PCB就包含着一切信息。
相关文章:

Linux:进程(二)
目录 一、cwd的理解 二、fork的理解 1.代码共享 2.各司其职 3.fork的返回值 三、进程状态 1.进程排队 2.进程状态 运行状态 阻塞状态 挂起状态 一、cwd的理解 cwd(current working directory)。译为当前工作目录。 在C语言中,使用…...

【UE5】将2D切片图渲染为体积纹理,最终实现使用RT实时绘制体积纹理【第二篇-着色器制作】
在上一篇文章中,我们已经理顺了实现流程。 接下来,我们将在UE5中,从头开始一步一步地构建一次流程。 通过这种方法,我们可以借助一个熟悉的开发环境,使那些对着色器不太熟悉的朋友们更好地理解着色器的工作原理。 这篇…...

【OceanBase 诊断调优】—— GC问题根因分析
GC 流程涉及到 RS 的状态切换和 LS 的资源安全回收,流程上较长。且 GC 线程每个租户仅有一个,某个日志流 GC Hang 死时会卡住所有其余日志流的 GC,进而造成更大的影响。 本文档会帮助大家快速定位到 GC 故障的模块,直达问题核心。…...

图像面积计算一般方法及MATLAB实现
一、引言 在数字图像处理中,经常需要获取感兴趣区域的面积属性,下面给出图像处理的一般步骤。 1.读入的彩色图像 2.将彩色图像转化为灰度图像 3.灰度图像转化为二值图像 4.区域标记 5.对每个区域的面积进行计算和显示 二、程序代码 %面积计算 cle…...

指挥平台在应急场所中的主要表现有哪些
在应对自然灾害、公共安全事件等突发危机时,指挥平台作为应急管理体系的核心枢纽,其重要性不言而喻。它不仅承载着信息的快速汇聚、精准分析与高效调度功能,更在应急场所中有一定的关键表现。接下来就跟着北京嘉德立一起了解一下。 一、信息集…...

智能养殖场人机交互检测系统源码分享
智能养殖场人机交互检测检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Co…...

数据集-目标检测系列-海洋鱼类检测数据集 fish>> DataBall
数据集-目标检测系列-海洋鱼类检测数据集 fish>> DataBall 数据集-目标检测系列-海洋鱼类检测数据集 fish 数据量:1W 数据项目地址: gitcode: https://gitcode.com/DataBall/DataBall-detections-100s/overview github: https://github.com/…...

网络威慑战略带来的影响
文章目录 前言一、网络威慑的出现1、人工智能带来的机遇二、网络空间的威慑困境1、威慑概念的提出2、网络威慑的限度3、人类对网络威胁的认知变化4、网络空间的脆弱性总结前言 网络威慑是国家为应对网络空间风险和威胁而采取的战略。冷战时期核威慑路径难以有效复制至网络空间…...
决策树算法在机器学习中的应用
决策树算法在机器学习中的应用 决策树(Decision Tree)算法是一种基本的分类与回归方法,它通过树状结构对数据进行建模,以解决分类和回归问题。决策树算法在机器学习中具有广泛的应用,其直观性、易于理解和实现的特点使…...

Leetcode面试经典150题-39.组合总数进阶:40.组合总和II
本题是扩展题,真实考过,看这个题之前先看一下39题 Leetcode面试经典150题-39.组合总数-CSDN博客 给定一个候选人编号的集合 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。 candidates 中的每个数…...

ProcessOn为什么导出有水印!!!(利用SVG转PNG)
processon-svg2png ProcessOn 一个非常好用的思维导图网站,但是为什么导出有水印!!!。 功能 支持按钮拖拽支持将流程图svg 转成 png下载支持修改自定义文字下载svg(开发中) 安装/使用方法 安装并使用…...
插入、更新与删除MySQL记录
在现代应用开发中,数据库操作是非常重要的一环。作为程序员,熟练掌握数据库的增删改功能,能够更有效地管理数据并提高开发效率。 本课程将围绕插入、更新与删除记录这三个操作展开,涵盖SQL中的常见语句:INSERT INTO、UPDATE 和 DELETE,并结合实际应用中的常见问题讨论如…...

【ARM】armv8的虚拟化深度解读
Type-1 hypervisor Type-1虚拟化也叫做Bare metal, standalone, Type1 Type2 hypervisor Type-2虚拟化也叫做hosted, Type-2 VM和vCPU(虚拟机和虚拟cpu) 在一个VM(虚拟机)中有多个vCPU,多个vCPU可能属于同一个Vritual Processor。 EL2…...

9/24作业
1. 分文件编译 分什么要分文件编译? 防止主文件过大,不好修改,简化编译流程 1) 分那些文件 头文件:所有需要提前导入的库文件,函数声明 功能函数:所有功能函数的定义 主函数:main函数&…...

Leetcode 106. 从中序与后序遍历序列构造二叉树
给定两个整数数组 inorder 和 postorder ,其中 inorder 是二叉树的中序遍历, postorder 是同一棵树的后序遍历,请你构造并返回这颗 二叉树 。 示例 1: 输入:inorder [9,3,15,20,7], postorder [9,15,7,20,3] 输出:[3…...

针对考研的C语言学习(定制化快速掌握重点1)
1.printf函数的几个要点 printf函数中所有的输出都是右对齐的,除非在%后面添加负号,则表示左对齐 #include<stdio.h> int main() {int num 10;int nums 100;float f 1000.2333333333;printf("%3d\n", nums);//%3d表示输出的总宽度至…...
【大数据入门 | Hive】DDL数据定义语言(数据库DataBase)
1. 数据库(DataBase) 1.1 创建数据库 语法: CREATE DATABASE [IF NOT EXISTS] database_name [COMMENT database_comment] [LOCATION hdfs_path] [WITH DBPROPERTIES (property_nameproperty_value, ...)]; 案例: (1)创建一个…...

CNVD漏洞和证书挖掘经验总结
前言 本篇文章主要是分享一下本人挖掘CVND漏洞碰到的一些问题,根据过往成功归档的漏洞和未归档的漏洞总结出的经验,也确实给审核的大佬们添了很多麻烦(主要真的没人教一下,闷着头尝试犯了好很多错误,希望各位以后交一个…...
阿里rtc旁路推流TypeScript版NODE运行
阿里云音视频服务云端录制typescript版本; 编译后可以使用 node index.js运行 package.json 版本 // npm install --save alicloud/rtc201801112.3.0 "alicloud/rtc20180111": "^2.3.0",引入 import Client, { StartCloudRecordRequest, StopCloudRecord…...
计算机书籍分享
0.简介 数据库系统概念、深入理解计算机系统、领域驱动设计、Linux高性能服务器编程 高清版本pdf 1.链接 数据库系统概念: 链接: https://pan.baidu.com/s/17zz7QFevV2Eni9qHJyLEGA 提取码: wfrx 深入理解计算机系统 链接: https://pan.baidu.com/s/19yiJG8GqHJR…...

C++实现分布式网络通信框架RPC(3)--rpc调用端
目录 一、前言 二、UserServiceRpc_Stub 三、 CallMethod方法的重写 头文件 实现 四、rpc调用端的调用 实现 五、 google::protobuf::RpcController *controller 头文件 实现 六、总结 一、前言 在前边的文章中,我们已经大致实现了rpc服务端的各项功能代…...
在rocky linux 9.5上在线安装 docker
前面是指南,后面是日志 sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo sudo dnf install docker-ce docker-ce-cli containerd.io -y docker version sudo systemctl start docker sudo systemctl status docker …...

渗透实战PortSwigger靶场-XSS Lab 14:大多数标签和属性被阻止
<script>标签被拦截 我们需要把全部可用的 tag 和 event 进行暴力破解 XSS cheat sheet: https://portswigger.net/web-security/cross-site-scripting/cheat-sheet 通过爆破发现body可以用 再把全部 events 放进去爆破 这些 event 全部可用 <body onres…...

el-switch文字内置
el-switch文字内置 效果 vue <div style"color:#ffffff;font-size:14px;float:left;margin-bottom:5px;margin-right:5px;">自动加载</div> <el-switch v-model"value" active-color"#3E99FB" inactive-color"#DCDFE6"…...
基础测试工具使用经验
背景 vtune,perf, nsight system等基础测试工具,都是用过的,但是没有记录,都逐渐忘了。所以写这篇博客总结记录一下,只要以后发现新的用法,就记得来编辑补充一下 perf 比较基础的用法: 先改这…...
Qt Http Server模块功能及架构
Qt Http Server 是 Qt 6.0 中引入的一个新模块,它提供了一个轻量级的 HTTP 服务器实现,主要用于构建基于 HTTP 的应用程序和服务。 功能介绍: 主要功能 HTTP服务器功能: 支持 HTTP/1.1 协议 简单的请求/响应处理模型 支持 GET…...

【Zephyr 系列 10】实战项目:打造一个蓝牙传感器终端 + 网关系统(完整架构与全栈实现)
🧠关键词:Zephyr、BLE、终端、网关、广播、连接、传感器、数据采集、低功耗、系统集成 📌目标读者:希望基于 Zephyr 构建 BLE 系统架构、实现终端与网关协作、具备产品交付能力的开发者 📊篇幅字数:约 5200 字 ✨ 项目总览 在物联网实际项目中,**“终端 + 网关”**是…...
3403. 从盒子中找出字典序最大的字符串 I
3403. 从盒子中找出字典序最大的字符串 I 题目链接:3403. 从盒子中找出字典序最大的字符串 I 代码如下: class Solution { public:string answerString(string word, int numFriends) {if (numFriends 1) {return word;}string res;for (int i 0;i &…...

C# 求圆面积的程序(Program to find area of a circle)
给定半径r,求圆的面积。圆的面积应精确到小数点后5位。 例子: 输入:r 5 输出:78.53982 解释:由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982,因为我们只保留小数点后 5 位数字。 输…...

学校时钟系统,标准考场时钟系统,AI亮相2025高考,赛思时钟系统为教育公平筑起“精准防线”
2025年#高考 将在近日拉开帷幕,#AI 监考一度冲上热搜。当AI深度融入高考,#时间同步 不再是辅助功能,而是决定AI监考系统成败的“生命线”。 AI亮相2025高考,40种异常行为0.5秒精准识别 2025年高考即将拉开帷幕,江西、…...