【运维工程师学习二】OS系统管理
【运维工程师学习二】OS系统管理
- 1、操作系统管理
- 2、进程管理
- 3、进程的启动
- 4、进程信息的查看
- 4.1、STAT 进程的状态:进程状态使用字符表示的(STAT的状态码),其状态码对应的含义:
- 4.2、ps命令常用用法(方便查看系统进程)
- 5、进程的关闭
- 5.1、Kill命令
- 5.2、常用的进程信号:
- 5.3、systemctl命令的常用命令。(httpd.service是apache的服务名称)
- 5.4、查看是否已安装httpd
- 5.5、安装httpd
- 5.6、查看httpd状态
- 5.7、开启httpd
- 总结
- 6、防火墙管理
- 7、firewalld区域概念
- 7.1、工作原理:
- 8、firewalld服务
- 8.1、关闭80端口
- 9、远程管理
- 总结
1、操作系统管理
操作系统管理着所有的硬件资源,负责响应各个应用的资源请求。应用还没有运行的时候就只是一堆各种各样的文件(二进制文件、文本文件等等),运行的时候,相对系统而言就是进程。比如你启动apache(linux下知名的web服务端),在系统中就启动了一个(或多个,假如配置了多个的话)进程,这个进程负责等待并处理用户的请求。
正常启动一个应用可能还需要其它支撑(如需要用到网络资源的,就需要网络服务),支撑别的应用的进程又可以叫做服务。
本文讲解的系统管理,无非就是进程管理、服务管理。不过管理一个系统,除了这两个常规工作外,还有防火墙管理、远程管理等,本文将对上面的概念及操作进行演示讲解。
注:windows下的操作请自行搜索了解,本文仍然是使用CentOS7系统(字符界面)作为演示。
2、进程管理
- 进程就是程序运行时的状态,因此是动态的,程序关闭了,进程也就退出了。
- 在演示进程管理之前,先说明一下,进程分两种:
前台进程
及后台进程
。 - 两者最大的区别就是:前台进程是在当前屏幕上看得见的,后台进程是在屏幕上看不见的,在后台默默地运行着的。
- 比如yum、find、vi等等这些是前台进程,apache、nginx、mysql等这些属于后台进程。可在运行程序的命令后面加&符号把前台进程放到后台运行。例如,使用yum安装GNOME图形界面需要安装很多软件,需要等待的时间十分长,则使用
yum groups install 'GNOME Desktop'-y &
- 通过在命令的最后增加&符号将yum放到后台运行,然后你可以继续做其它事情。如果你做完了其它事情,想看看yum安装得怎么样了,可以使用
fg
命令将刚刚放到后台的进程调到前台来看。 - 进程管理是管理什么东东呢?无非就是管理进程的启动、关闭及查看该进程的运行情况(对系统资源的使用情况)。其实刚刚的&符号及fg命令都属于进程管理的范畴。
3、进程的启动
上面提到的进程分前台进程及后台进程,这是从不同应用来区分的,但同一个应用的进程下又有父进程、子进程之分(一般是大型应用才会这样设计,如nginx等)。子进程是由一个进程所产生的进程,产生这个子进程的进程称为父进程。父进程终止子进程自然终止。
- 启动一个应用就相应启动了对应的进程,因此进程的启动没有什么好说的。
- 启动了一个vi进程,不过加了&符号,意思是放在后台运行
vi test.txt &
- vi进程的信息,包括用户,启动时间等等。
- ps是查看进程信息的工具,下面会继续演示ps的常用方法
ps aux | grep vi
4、进程信息的查看
Linux中的ps命令是Process Status的缩写,进程状态的意思。Ps命令有很多参数,最常用的参数组合是-aux
(显示的信息较全面),下面是ps –aux
的输出结果,每列输出的意义如下:
参数 | 具体意义 |
---|---|
USER | 用户名 |
PID | 进程ID(Process ID) |
%CPU | 进程的cpu占用率 |
%MEM | 进程的内存占用率 |
VSZ | 进程所使用的虚存的大小(Virtual Size) |
RSS | 进程使用的驻留集大小或者是实际内存的大小,Kbytes字节 |
TTY | 与进程关联的终端(tty) |
STAT | 进程的状态:进程状态使用字符表示的(STAT的状态码) |
START | 进程启动时间和日期 |
TIME | 进程使用的总cpu时间 |
COMMAND | 正在执行的命令行命令 |
上面截图显示的大多是系统进程,因此为快速查看自己指定的进程,经常与grep结合使用,如:
ps –aux | grep vi
显示关于vi进程的信息。
4.1、STAT 进程的状态:进程状态使用字符表示的(STAT的状态码),其状态码对应的含义:
- R 运行 Runnable (on run queue) 正在运行或在运行队列中等待。
- S 睡眠 Sleeping 休眠中, 受阻, 在等待某个条件的形成或接受到信号。
- I 空闲 Idle
- Z 僵死 Zombie(a defunct process) 进程已终止, 但进程描述符存在,
直到父进程调用wait4()系统调用后释放。 - D 不可中断 Uninterruptible sleep (ususally IO) 收到信号不唤醒和不可运行,
进程必须等待直到有中断发生。 - T 终止 Terminate 进程收到SIGSTOP, SIGSTP, SIGTIN,
SIGTOU信号后停止运行运行。 - P 等待交换页
- W 无驻留页 has no resident pages 没有足够的记忆体分页可分配。
- X 死掉的进程
- < 高优先级进程 高优先序的进程
- N 低优先 级进程 低优先序的进程
- L 内存锁页 Lock 有记忆体分页分配并缩在记忆体内
- s 进程的领导者(在它之下有子进程);
- l 多进程的(使用 CLONE_THREAD, 类似 NPTL pthreads)
- +位于后台的进程组
4.2、ps命令常用用法(方便查看系统进程)
1)ps a
显示现行终端机下的所有程序,包括其他用户的程序。
2)ps -A
显示所有进程。
3)ps c
列出程序时,显示每个程序真正的指令名称,而不包含路径,参数或常驻服务的标示。
4)ps -e
此参数的效果和指定"A"参数相同。
5)ps e
列出程序时,显示每个程序所使用的环境变量。
6)ps f
用ASCII字符显示树状结构,表达程序间的相互关系。
7)ps -H
显示树状结构,表示程序间的相互关系。
8)ps -N
显示所有的程序,除了执行ps指令终端机下的程序之外。
9)ps s
采用程序信号的格式显示程序状况。
10)ps S
列出程序时,包括已中断的子程序资料。
11)ps -t
<终端机编号> 指定终端机编号,并列出属于该终端机的程序的状况。
12)ps u
以用户为主的格式来显示程序状况。
13)ps x
显示所有程序,不以终端机来区分。
最常用的方法是ps -aux,然后再利用一个管道符号导向到grep去查找特定的进程,然后再对特定的进程进行操作。
5、进程的关闭
关闭进程有很多方法,最常用的有kill命令及一些快捷键(Ctrl+c或Ctrl+z等)。
前台进程一般有退出指令,如vi,top的退出指令都是q。
前台进程一般使用应用自身的退出指令(多数是q),但像yum这种前台进程,它在运行过程中不提供指令退出,这时可以使用快捷键退出,或使用kill命令。
下面演示一下这两个快捷键及kill命令。
在yum运行的过程,输入了Ctrl+c快捷键来中止yum的运行。
Ctrl+c与Ctrl+z都是中止进程的运行,但两者是有区别的。
Ctrl+c强制退出该进程
Ctrl+z进程中止运行,但在系统中处于挂起状态,后续可以使用fg命令将该进程调出来再继续运行。
- 第一次使用Ctrl+c,使用ps –aux来看,没有再看到yum进程的信息了。
- 第二次使用Ctrl+z,使用ps –aux来看,能看到yum进程的信息了。
温馨提示:
1、这里显示的这个是grep的进程信息,并不是yum的进程信息
2、^ 表示Ctrl。^c就表示是Ctrl+c
3、强制中止对于数据不敏感的程序可以使用,但如果是数据库的进程,请慎用强制中止。
5.1、Kill命令
除了使用快捷键,使用kill命令也可以关闭进程。kill命令的格式是:
kill[参数][进程号]
由此可见,除输入正确的参数外,还需要知道进程对应的进程号。如何获得进程号?请参考前面“进程信息的查看”。ps –aux
命令输出结果中的PID(进程ID(Process ID))。
- 前面演示时使用Ctrl+z将yum进程放到了后台,通过ps命令查到其进程ID为8769,因此使用
kill -9 8769
便“杀死”了该进程。再次使用ps命令查询关于yum的进程信息,已无输出结果。
命令参数:-l 信号,若果不加信号的编号参数,则使用“-l”参数会列出全部的信号名称-a 当处理当前进程时,不限制命令名和进程号的对应关系-p 指定kill 命令只打印相关进程的进程号,而不发送任何信号-s 指定发送信号-u 指定用户
5.2、常用的进程信号:
HUP 1 终端断线INT 2 中断(同 Ctrl + C)QUIT 3 退出(同 Ctrl + \)TERM 15 终止KILL 9 强制终止CONT 18 继续(与STOP相反, fg/bg命令)STOP 19 暂停(同 Ctrl + Z)
温馨提示:强制中止对于数据不敏感的程序可以使用,但如果是数据库的进程,请慎用强制中止。
-9是强制退出指令,init进程是不可杀的
5.3、systemctl命令的常用命令。(httpd.service是apache的服务名称)
要成功执行如上命令,请确保你安装了httpd,如下图示:
5.4、查看是否已安装httpd
rpm -aq | grep httpd
5.5、安装httpd
yum install -y httpd
5.6、查看httpd状态
sudo service httpd start
5.7、开启httpd
systemctl status httpd.service
总结
- 新手不要乱关闭系统服务(不清楚该服务的真正用途)已免系统出现某些功能不可用或崩溃;
对于新手可以将systemctl理解为只是管理开机启动的命令,如前面演示的,我想要httpd服务开机启动,则使用systemctl enable httpd.service
,如要取消开机启动则使用systemctl disenable httpd.service
。 - 注意:该举例只适用于使用yum安装的httpd,编译安装的话需要自行建立适当文件才能实现这样管理httpd服务的启动与关闭;
- 前面介绍系统的安装时,讲解网络服务的重启也是使用了
systemctl restart network
,同理ssh服务也可使用该命令管理;
6、防火墙管理
要管好一个防火墙涉及太多的网络知识,如果还没有网络基础的同学,请留待有一定的网络基础之后再回过头来了解。
CentOS7开始,使用了firewalld
代替之前的iptables
,因此这里说的防火墙管理是针对CentOS7中的firewalld程序。firewall-cmd
是该程序的管理命令,如果没有该命令说明系统还没有安装firewalld,请使用yum install firewalld firewall-config
命令安装。
7、firewalld区域概念
1.trusted 信任区域 默认允许所有流量传入
2.public 公共区域 (默认区域)默认允许ssh 服务 dhcp
3.external 外部区域 默认允许ssh其余均拒绝
4.home 家庭区域 有ssh, 预定于服务等
5.internal 内部区域 默认允许ssh 服务 dhcp服务等
6.work 工作区域 默认ssh
7.dmz 隔离区
8.block 限制区域 默认拒绝所有流量传入
9.drop 丢弃区域 默认丢弃所有流量传入
7.1、工作原理:
管理数据包时:
1、先根据数据包的源IP进行相应区域的防火墙规则匹配; 如果源地址关联到特定的区域,则按特定区域的规则执行; 如果未关联到特定的区域,则按默认区域的规则执行。
2、根据传入的网络接口,进行相应区域的防火墙规则匹配; 如果源地址关联到特定的区域,则按特定区域的规则执行; 如果未关联到特定的区域,则按默认区域的规则执行。
绑定源地址的区域规则> 网卡绑定的区域规则> 默认区域规则
8、firewalld服务
systemctl status firewalldsystemctl start firewalldsystemctl enable firewalld# 显示所有可用区域firewall-cmd --get-zones# 显示当前默认区域firewall-cmd --get-default-zone# 设置默认区域firewall-cmd --set-default-zone=public# 显示当前使用的区域和对应网卡firewall-cmd --get-active-zones# 显示指定接口绑定的区域firewall-cmd --get-zone-of-interface=ens33# 为指定接口绑定区域firewall-cmd --zone=dmz --add-interface=ens37# 为指定的区域更改绑定的网络接口firewall-cmd --zone=dmz --change-interface=ens33# 为指定的区域删除绑定的网络接口firewall-cmd --zone=dmz --remove-interface=ens37# 查看默认区域设置firewall-cmd --list-all# 查看指定的区域设置firewall-cmd --zone=dmz --list-all# 显示指定区域可以访问的服务firewall-cmd --zone=public --list-services# 显示系统预定义的服务名firewall-cmd --get-service# 为指定区域添加允许访问的服务firewall-cmd --zone=public --add-service=http# 为指定区域删除允许访问的服务firewall-cmd --zone=public --remove-service=http# 添加多个服务firewall-cmd --zone=public --add-services={http,https,redis,ssh}# 永久生效,运行时配置结束后统一执行firewall-cmd --runtime-to-permanent# 永久生效,需要在设置时加--permanent选项,但是并不是运行时生效,需要重启启动firewalld或者重
#新reloadfirewall-cmd --permanent --zone=public --add-services=httpfirewall-cmd --reload 或者 systemctl restart firewalld# 显示指定域中允许访问的端口firewall-cmd --zone=public --list-port# 位指定域中添加允许访问的端口firewall-cmd --zone=public --add-port=22/tcp --add-port=80-100/tcp#位指定域中删除允许访问的端口firewall-cmd --zone=public --remove-port=22/tcp --remove-port=80-100/tcp
8.1、关闭80端口
#列出已开放的服务(端口)
firewall-cmd --list-services
#添加http服务(80端口)到防火墙中
firewall-cmd --add-service=http
对仅处于学习网络应用(http、mysql等)的同学,最好的办法是直接关闭firewalld,但如果你不想关闭防火墙,那你就得知道如何在防火墙中开启http的端口(80)。本文仅演示http默认端口(80)的开放。
如果你的http服务端已启动,则此时你可以在另外一台机器尝试访问你部署的网页了。同理,
firewall-cmd --add-service=mysql
- 在防火墙中允许别人访问你的3306端口(mysql数据库默认端口)。
如要防火墙永久开放端口,需要命令后面加—permanent参数,如:
firewall-cmd --add-service=http --permanent
防火墙默认开放22端口(ssh远程服务的默认端口),但如果你修改了ssh的默认端口,则你需要修改防火墙中的规则。由于你不使用22这个默认端口,则不可以使用上面“添加服务”的方式来开放端口,请自行搜索资料解决。
9、远程管理
- Linux字符界面的远程使用ssh协议,图形界面的远程使用vnc。
- CentOS最小安装会自动安装ssh服务端并自动开启(需要注意:ubuntu最小化安装则不会安装ssh服务端),ssh协议默认端口是22,如果你想系统安全一些,不那么轻易被人扫描到,则修改ssh远程端口的方法是:
修改/etc/ssh/sshd_config
文件中的行,将“#Port 22
”修改“Port 你想的端口
”,如“Port
65222”,然后重启sshd服务,命令是systemctl restart sshd
总结
本文介绍了OS系统管理的进程管理、服务管理、防火墙管理、远程管理的基本用法,后续运维工程师学习请关注我的更新~
相关文章:

【运维工程师学习二】OS系统管理
【运维工程师学习二】OS系统管理 1、操作系统管理2、进程管理3、进程的启动4、进程信息的查看4.1、STAT 进程的状态:进程状态使用字符表示的(STAT的状态码),其状态码对应的含义:4.2、ps命令常用用法(方便查看系统进程&…...
【前端技巧】CSS常用知识碎片(九)
CSS常用知识碎片(九) mask-image属性 带有半透明的PNG图像的遮罩效果 .mask-image {mask: no-repeat center / contain;mask-image: url(bird.png); }SVG图形遮罩效果 .mask-image {mask-image: url("data:image/svgxml,%3Csvg viewBox0 0 3232…...

SQL 上升的温度
197 上升的温度 SQL架构 表: Weather ---------------------- | Column Name | Type | ---------------------- | id | int | | recordDate | date | | temperature | int | ---------------------- id 是这个表的主键 该表包含特定日期的温度信息 编写一个 SQL …...
Matlab实现最优化(附上多个完整仿真源码)
最优化是一种寻找最优解的数学方法,它在各个领域都有广泛的应用。在Matlab中,有多种工具箱和函数库可以用来实现最优化,下面我们来介绍一下如何用Matlab实现最优化。 1. 定义目标函数 在开始最优化之前,需要定义一个目标函数。目…...

es下载历史的tar文件
第一步进入官网找到历史版本 第二步复制历史版本名称组合成下面的链接 直接get访问下载。如下链接所示只需要修改7.3.0这个版本号 https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.3.0-linux-x86_64.tar.gz...
顺畅下载chatglm2-6b的模型文件
不管是从huggingface下,git下,wget下,都可能卡。 用推荐的清华源的url下,也卡,但url转换之后的,在windows下不了。 但是在linux上就几十兆每秒 wget https://cloud.tsinghua.edu.cn/seafhttp/files/0d8b273…...

go语言 socket: too many open files 错误分析
问题背景: 近期针对老的PHP接口做了迁移重构,用golang重新实现,在上线之前,测试进行了压测,压测的量级为:200请求/s, 连续请求10s,发现接口出现大量超时错误,查看日志发现错误信息为…...

分布式搜索--elasticsearch
一、初识 elasticsearch 1. 了解 ES ① elasticsearch 是一款非常强大的开源 搜索引擎,可以帮助我们从海量数据中 快速找到需要的内容 ② elasticsearch 结合 kibana、Logstash、 Beats,也就是 elastic stack (ELK),被 广泛应用在日志数据分…...

UE5《Electric Dreams》项目PCG技术解析 之 PCGCustomNodes详解(一)
《Electric Dreams》项目中提供了一些自定义节点和子图(文件位置:“/Content/PCG/Assets/PCGCustomNodes”),这些节点和子图在《Electric Dreams》被广泛使用,对于理解《Electric Dreams》非常重要,而且它们可以直接移…...

500万PV的网站需要多少台服务器?
1. 衡量业务量的指标 衡量业务量的指标项有很多,比如,常见Web类应用中的PV、UV、IP。而比较贴近业务的指标项就是大家通常所说的业务用户数。但这个用户数比较笼统,其实和真实访问量有比较大的差距,所以为了更贴近实际业务量及压力…...
拖动排序功能的实现 - 使用HTML、CSS和JavaScript
引言 在现代Web应用程序中,拖动排序是一种常见的用户界面交互方式,它允许用户通过拖动元素来重新排列列表或项目的顺序。本文将介绍如何使用HTML、CSS和JavaScript来实现手动拖动排序功能。 一、HTML结构 首先,我们需要定义一个列表&#…...

【STM32MP135 - ST官方源码移植】第三章:OPTEE源码移植教程
STM32MP135 OPTEE源码移植教程 一、解压optee的源码压缩包二、拷贝新的设备树文件三、修改Makefile.sdk文件(1)增加stm32mp135d-atk设备树编译(2)修改编译器为arm-none-linux-gnueabihf(3)使用buildroot工具…...

云主机安全-私有密钥安全认证
场景描述 云主机凭借其性价比高、生配扩容便利、运维便捷、稳定性高等优势深受用户青睐,越来越多的企业开始租用云主机,将自己的服务器、业务系统等搭建或存储到云主机上。 用户痛点 用户租用或托管的云主机,运维端口(远程桌面&…...
《Web安全基础》02. 信息收集
web 1:CDN 绕过1.1:判断是否有 CDN 服务1.2:常见绕过方法1.3:相关资源 2:网站架构3:WAF4:APP 及其他资产5:资产监控 本系列侧重方法论,各工具只是实现目标的载体。 命令与…...
ffmpeg根据原始视频的帧率进行提取视频帧
直接上代码,自己编写的。。。有问题可以提 安装教程看这个:https://blog.csdn.net/m0_61497715/article/details/129817641 去官网下个最新的ffmpeg,解压到随便的目录,上级目录最好不要用中文; 然后去设置环境变量&am…...

从零搭建秒杀服务
1. 前言 目的:该项目只用于技术交流,不用于过多商业用途。 适用:可用于简历亮点、毕业答辩等。 2. 项目成果 2.1 秒杀主页 包含5个功能点: ①、Product Name:秒杀商品名称 ②、Product Image:秒杀商…...

数据库应用:CentOS 7离线安装PostgreSQL
目录 一、理论 1.PostgreSQL 2.PostgreSQL离线安装 3.PostgreSQL初始化 4.PostgreSQL登录操作 二、实验 1.CentOS 7离线安装PostgreSQL 2.登录PostgreSQL 3.Navicat连接PostgreSQL 三、总结 一、理论 1.PostgreSQL (1)简介 PostgreSQL 是一个…...
【PHP面试题42】Laravel依赖注入实现的原理是怎么样的
文章目录 一、前言二、什么是依赖注入三、Laravel依赖注入的实现原理3.1 Laravel依赖注入的实现原理:3.2 Laravel依赖注入的代码示例 四、总结 一、前言 本文已收录于PHP全栈系列专栏:PHP面试专区。 计划将全覆盖PHP开发领域所有的面试题,对标…...

如何在本地组策略编辑器中启用或禁用剪贴板历史记录
复制粘贴是我们大家都会做的事情,可能一天要做多次。但是,如果你需要一次又一次地复制同样的几件事,你该怎么办?如何在设备上复制内容? 从Windows 10版本17666开始,微软正在解决这一问题,并将剪贴板提升到一个新的水平,只需按下Win+V,你将获得全新的剪贴板体验。 你…...

如何与ChatGPT愉快地聊天
原文链接:https://mp.weixin.qq.com/s/ui-O4CnT_W51_zqW4krtcQ 人工智能的发展已经走到了一个新的阶段,在这个阶段,人工智能可以像人一样与我们进行深度的文本交互。其中,OpenAI的ChatGPT是一个具有代表性的模型。然而࿰…...
Java求职者面试:微服务技术与源码原理深度解析
Java求职者面试:微服务技术与源码原理深度解析 第一轮:基础概念问题 1. 请解释什么是微服务架构,并说明其优势和挑战。 微服务架构是一种将单体应用拆分为多个小型、独立的服务的软件开发方法。每个服务都运行在自己的进程中,并…...
Steam爬取相关游戏评测
## 因为是第一次爬取Steam。所以作为一次记录发出;有所错误欢迎指出。 无时间指定爬取 import requests import time import csv import osappid "553850" # 这里你也可以改成 #appid int(input()) max_reviews 10000 # 想爬多少条 # max_reviews…...

网页抓取混淆与嵌套数据处理流程
当我们在网页抓取中,遇到混淆和多层嵌套的情况是比较常见的挑战。混淆大部分都是为了防止爬虫而设计的,例如使用JavaScript动态加载、数据加密、字符替换、CSS偏移等。多层嵌套则可能是指HTML结构复杂,数据隐藏在多层标签或者多个iframe中。 …...

Python训练营---DAY48
DAY 48 随机函数与广播机制 知识点回顾: 随机张量的生成:torch.randn函数卷积和池化的计算公式(可以不掌握,会自动计算的)pytorch的广播机制:加法和乘法的广播机制 ps:numpy运算也有类似的广播机…...

量子计算导论课程设计 之 PennyLane环境搭建
文章目录 具体配置conda 虚拟环境配置Pennylane 正所谓,磨刀不误砍柴工,想要进行量子计算导论的课程设计,首先就是搭建好平台,推荐大家就是本地搭建,那么下面有三种选择 QiskitTensorFlow QuantumPennylane 具体配置…...

【大模型】【推荐系统】LLM在推荐系统中的应用价值
文章目录 A 论文出处B 背景B.1 背景介绍B.2 问题提出B.3 创新点B.4 两大推荐方法 C 模型结构C.1 知识蒸馏(训练过程)C.2 轻量推理(部署过程) D 实验设计E 个人总结 A 论文出处 论文题目:SLMRec:Distilling…...
计算机基础知识(第五篇)
计算机基础知识(第五篇) 架构演化与维护 软件架构的演化和定义 软件架构的演化和维护就是对架构进行修改和完善的过程,目的就是为了使软件能够适应环境的变化而进行的纠错性修改和完善性修改等,是一个不断迭代的过程࿰…...

随机算法一文深度全解
随机算法一文深度全解 一、随机算法基础1.1 定义与核心特性1.2 算法优势与局限 二、随机算法经典案例2.1 随机化快速排序原理推导问题分析与策略代码实现(Python、Java、C) 2.2 蒙特卡罗方法计算 π 值原理推导问题分析与策略代码实现(Python…...
Vue前端篇——Vue 3的watch深度解析
📌 前言 在 Vue.js 的世界中,“数据驱动”是其核心理念之一。而在这一理念下,watch 扮演着一个非常关键的角色。它允许我们监听响应式数据的变化,并在其发生变化时执行特定的业务逻辑。 本文将通过实际代码示例,深入…...

链表好题-多种实现
143. 重排链表 - 力扣(LeetCode) 这道题非常经典,很多大厂都作为面试题。 方法一:寻找中点翻转链表合并链表 class Solution { public:void reorderList(ListNode* head) {if (head nullptr) {return;}ListNode* mid middleNo…...