Linux——Shell运行原理以及Linux权限
目录
1. Shell的运行原理
2. Linux中的权限问题
2.1 Linux权限的概念
2.1.1 如何实现用户账号之间的切换
2.1.2 如何将普通用户添加到信任列表中
2.1.3 如何仅提升当前指令的权限
2.2 Linux权限管理
2.2.1 文件访问者的分类(人)
2.2.2 文件类型和访问权限(事物属性)
2.2.3 文件权限值的表示方法
2.2.3.1 字符表示法
2.2.3.2 八进制表示法
2.2.4 文件访问权限的相关设置方法
2.2.4.1 chmod指令权限值
2.2.4.2 改变文件的拥有者
2.2.4.3 修改文件的所属组
2.2.4.4 修改文件的权限掩码
2.2.5 目录的权限
2.2.6 粘滞位
1. Shell的运行原理
我们都知道Windows以图形化界面为交互方式,而Linux以命令行界面为交互方式。
图形化界面和命令行界面都是为了让用户进行相关操作,而图形化界面和命令行界面就是我们所说的“外壳程序”。
Linux严格意义上说是一个操作系统,我们称之为“核心(kernel)”,但我们一般用户不能直接使用kernel,而是通过kernel的“外壳程序”,也就是所谓的Shell,来与kernel沟通。
Shell最简单的定义就是“命令行解释器”:
1)将使用者的命令翻译给核心(kernel)处理。
2)将核心的处理结果翻译给使用者。
对比Windows中的图形化界面(GUI),我们操作Windows并不是直接操作Windows内核,而是通过图形接口,点击,从而完成我们的操作。
Shell对于Linux具有相同的作用,主要是对我们的指令进行解析,解析指令给Linux内核,反馈结果再通过内核运行出结果,通过Shell解析给用户。
那么上面我们认识了Shell是什么,下面我们来谈它的运行原理。
Shell运行原理:
1)创建子进程,让子进程进行命令行解释。
2)子进程出现任何问题,都不影响父进程Shell。
这里我们简单理解,其实就是子进程与父进程是相互独立的,我们来Windows下启动一个程序,本质上是创建了一个子进程;比如我们打开微信,再打开QQ;如果此时微信程序终止了,或者我们退出了,QQ不会受到任何影响,这就是因为微信和QQ是两个独立的子进程,谁都不影响谁。
注意: Shell只是所有外壳程序的统称,例如在centos 7当中的外壳程序名叫bash。
2. Linux中的权限问题
2.1 Linux权限的概念
关于权限的概念,这里其实简单理解:”权限“就是能或者不能做什么。大家需要知道:权限=角色+目标属性。
在Linux下有两种用户,分别是超级用户(root)和普通用户。超级用户可以在Linux下做任何事情,几乎不受限制,而普通用户一般只能在自己的工作目录下(/home/xxx)工作,以及在系统上做有限的工作。
换句话来说,所有的权限的概念都是用来限制普通用户的,而超级用户几乎不受限制。
超级用户的命令提示符是“#”。
root@hcss-ecs-348a:~# whoami
root
普通用户的命令提示符是“$”。
cp@hcss-ecs-348a:/root$ whoami
cp
2.1.1 如何实现用户账号之间的切换
语法: su 用户名/su
功能: 用户切换。
从普通账号切换为root账号。
cp@hcss-ecs-348a:/root$ su
Password:
上面是我们从普通用户切换到超级用户的命令行操作,在Linux中密码是不回显的。
root@hcss-ecs-348a:~# su cp
cp@hcss-ecs-348a:/root$
上面是从超级用户切换到普通用户的命令行操作,超级切换普通是不需要输入密码的。
2.1.2 如何将普通用户添加到信任列表中
首先我们要切换到超级用户,然后使用vim打开文件sudoers进行添加(vim /etc/sudoers
)。打开后往下滑动,你会看见类似下面的命令行,这时按“i”切换到插入模式,将自己的普通用户名添加上去就OK了,我这里是ubuntu22.04系统下运行的。
# User privilege specification
root ALL=(ALL:ALL) ALL
cp ALL=(ALL:ALL) ALL
添加完成后,我们按“Esc”退出插入模式,再按“Shift+:”进入底行模式,你会在最后一行看见“:”,然后输入“wq!”保存退出即可。
2.1.3 如何仅提升当前指令的权限
但可能某些情况下,你只想提升当前指令的权限,那么不必切换到超级用户。
语法: sudo 指令
功能: 提升当前指令的权限。
例如,我现在要以一名普通用户的身份,修改另一个普通用户的账号密码。
cp@hcss-ecs-348a:/root$ ls /home
cp xjy
cp@hcss-ecs-348a:/root$ whoami
cp
cp@hcss-ecs-348a:/root$ sudo passwd xjy
[sudo] password for cp:
New password:
Retype new password:
passwd: password updated successfully
2.2 Linux权限管理
那么Linux中为什么要设计权限呢?其实就是为了限制用户的行为,防止错误的发生。
那么结合上面的内容,我们来理解一下权限是怎么来”限制“的,分两点:
首先,权限限制的角色(人);
其次,权限要求目标必须具有对应属性。
2.2.1 文件访问者的分类(人)
对于用户来说,权限可以将用户分为三大类:
1)文件和文件目录的所有者(文件拥有者)。
2)文件拥有者所在的组的用户(文件所属组)。
3)其他用户(other)。
注意:
1)对于某一文件而言,其拥有者、所属组和other就是由超级用户(root)和普通用户所扮演。
2)在Linux当中,所有用户都要隶属于某一个组,哪怕这个组只有你一个人(此时该组就以你的用户名为组名)。
这里我们可以通过“ll”命令来查看文件的拥有者和所属组。
那么大家思考一下为什么要由所属组这个概念呢?
其实这里也很好理解,如果我们没有所属组这个概念,那么当我们创建一个文件后,要么就是只有你自己(拥有者)能看到,要么就是其他人(other)也都能看到。而你所希望的是你自己和你的小组成员能看到,剩下的人看不到。
于是就有了所属组这个概念,这时你就可以将文件设置为拥有者和所属组可见,而other不可见。所以所属组的存在是为了更灵活的进行权限配置,满足团队协作。
注: 除了文件拥有者和文件所属组之外的都叫other。
2.2.2 文件类型和访问权限(事物属性)
在Linux中,一切皆文件。
那么根据上面的结论,权限要求的”目标“当然也是文件,那么要求其有对应属性,文件有哪些属性呢?
在Linux中,文件的属性就三种:读、写、执行。
同样还是使用指令“ll”来查看文件属性
这串字符由10个字符组成的。其中第一个字符所代表的就是该文件的文件类型。
不同的字符代表不同的文件类型。
1)-:代表普通文件。
2)d:代表目录。
3)l:代表链接文件(类似于Windows当中的快捷方式)。
4)b:代表块设备文件(例如硬盘、光驱等)。
5)p:管道文件。
6)c:字符设备文件。
7)s:套接口文件。
注意: 在Linux当中,文件类型与文件后缀无关。
剩下的9个字符每三个为一组,分别代表该文件相对于其拥有者、所属组以及other是否拥有某种属性。
每一组的三个字符的第一个字符代表该文件是否具有可读属性,第二个代表是否具有可写属性,第三个代表是否具有可执行属性。
若是具有可读属性,则第一个位置的字符为r;若是具有可写属性,则第二个位置的字符为w;若是具有可执行属性,则第三个位置的字符为x。若某一位置为字符 - ,则说明不具有对应位置的属性。
下面我们举个例子,来描述一个文件的权限:
-rw-rw-r-- 1 cp cp 0 Mar 12 12:08 test4.txt
-rw-r--r-- 1 root root 0 Mar 12 12:10 test5.txt
对于test4.txt来说,test.txt是一个普通文件,该文件的拥有者和所属组对其都是可读可写的,但该文件的other对其只有读的权限。
对于test5.txt来说,test5.txt是一个普通文件,该文件的拥有者对其有读和写的权限;该文件的所属组和other都只对其有读的权限。
2.2.3 文件权限值的表示方法
2.2.3.1 字符表示法
ll指令打印文件权限值时的表示方法就是字符表示法。例如
2.2.3.2 八进制表示法
字符表示法中的每一个字符所在位置所表示的结果只有两种可能,要么为真,要么为假,因此我们可以将这三个字符换为三个二进制位,进而换为一个八进制位进行表示。例如
2.2.4 文件访问权限的相关设置方法
2.2.4.1 chmod指令权限值
语法: chmod 选项 权限 文件名或目录名
功能: 设置文件的访问权限。
格式一: 用户符号 +/-/= 权限字符
1)+:向权限范围增加权限代号所表示的权限。
2)-:向权限范围取消权限代号所表示的权限。
3)=:向权限范围赋予权限代号所表示的权限。
用户符号:
1)u:拥有者。
2)g:所属组。
3)o:other。
4)a:所有用户。
修改前:
-rw-rw-r-- 1 cp cp 0 Mar 12 12:08 test4.txt
cp@hcss-ecs-348a:~$ chmod o+wx test4.txt(指令修改)
修改后:
-rw-rw-rwx 1 cp cp 0 Mar 12 12:08 test4.txt*
若要同时设置不同类用户的访问权限,则需用逗号隔开。
修改前:
-rw-rw-rwx 1 cp cp 0 Mar 12 12:08 test4.txt*
cp@hcss-ecs-348a:~$ chmod o-wx,u+x test4.txt(指令修改)
修改后:
-rwxrw-r-- 1 cp cp 0 Mar 12 12:08 test4.txt*
格式二: 三位八进制数字
将对应的八进制数转换为二进制,进而设置对应权限值。
修改前:
-rwxrw-r-- 1 cp cp 0 Mar 12 12:08 test4.txt*
cp@hcss-ecs-348a:~$ chmod 667 test4.txt(指令修改)
这里的667是八进制数字,换成二进制就是110110100,就代表rw-rw-rwx。
修改后:
-rw-rw-rwx 1 cp cp 0 Mar 12 12:08 test4.txt*
2.2.4.2 改变文件的拥有者
语法: chown 选项 用户名 文件名或目录名
功能: 修改文件的拥有者。
修改前:
-rw-rw-rwx 1 cp cp 0 Mar 12 12:08 test4.txt*
修改指令:cp@hcss-ecs-348a:~$ sudo chown root test4.txt
[sudo] password for cp:
修改后:
-rw-rw-rwx 1 root cp 0 Mar 12 12:08 test4.txt*
这里大家会发现这个文件的拥有者被改成了root。
注意: 修改文件的拥有者需要root用户进行操作,若是普通用户则需要进行权限提升。
也可以使用chown指令同时修改文件的拥有者和所属组,将拥有者和所属组的用户名用冒号隔开即可。
修改前:
-rw-rw-rwx 1 cp cp 0 Mar 12 12:08 test4.txt*
修改指令:cp@hcss-ecs-348a:~$ sudo chown root:root test4.txt
修改后:
-rw-rw-rwx 1 root root 0 Mar 12 12:08 test4.txt*
2.2.4.3 修改文件的所属组
语法: chgrp 选项 用户名 文件名或目录名
功能: 修改文件的所属组。
修改前:
-rw-rw-rwx 1 root root 0 Mar 12 12:08 test4.txt*
修改指令:cp@hcss-ecs-348a:~$ sudo chgrp cp test4.txt
修改后:
-rw-rw-rwx 1 root cp 0 Mar 12 12:08 test4.txt*
2.2.4.4 修改文件的权限掩码
这里大家需要思考一个问题,为什么新建的文件和目录都有默认的权限?
drwxrwxr-x 2 cp cp 4096 Mar 12 12:02 mytest/
-rw-rw-r-- 1 cp cp 0 Mar 12 18:06 test6.txt
这里我们看到的权限是最终权限,而最终权限=默认权限&(~umask)
在Linux中,新建文件的默认权限为666,新建目录的默认权限为777;
这里提到的umask是系统内默认存在的一个叫作权限掩码的概念:
我们可以通过指令来查看我们系统权限掩码:
语法: umask 权限值
功能: 查看或修改文件掩码。
cp@hcss-ecs-348a:~$ umask
0002
这里我的系统的权限掩码就是0002。
那么权限掩码的目的是什么呢?
其实通过上面的图,大家可以发现其目的就在于希望权限掩码中出现的权限不在最终权限中出现。
那为什么要设计权限掩码呢?
第一点在于,最终权限由操作系统自主决定,无法在创建前进行修改——系统可配置、可灵活满足需要的一种表现。
第二点在于,特殊情况下,我们可以通过配置umask来控制文件的最终权限,让代码实现可控。
有了上面的铺垫,想必大家也可以想到,我们可以通过改变权限掩码来设置文件的访问权限:
cp@hcss-ecs-348a:~$ umask 000
cp@hcss-ecs-348a:~$ touch data.txt
-rw-rw-rw- 1 cp cp 0 Mar 12 18:26 data.txt
大家可以看到,data.txt文件的最终权限是受到权限掩码的影响的。
cp@hcss-ecs-348a:~$ umask 777
cp@hcss-ecs-348a:~$ mkdir file
d--------- 2 cp cp 4096 Mar 12 18:28 file/
这里同上,我们创建的新目录file的最终权限是受到权限掩码的影响的。
注意: 超级用户的默认掩码为0022,普通用户的默认掩码为0002。
2.2.5 目录的权限
对于文件来说,其可读可写可执行的属性我们都知道分别代表着什么对应的操作,那对于目录来说可读可写可执行又分别代表着什么呢?
1)可读权限: 如果用户没有该目录的可读权限,则无法通过ls指令查看目录中的文件内容。
2)可写权限: 如果用户没有该目录的可写权限,则无法通过一系列指令在目录中创建文件或删除文件。
3)可执行权限: 如果用户没有该目录的可执行权限,则无法通过cd指令进入到目录当中。
那么这就会出现一个问题:
只要用户拥有某目录的可写权限,就可以删除该目录当中的文件,而不论该用户是否拥有该文件的可写权限,这显然是不合理的。
drwxr-xrwx 2 root root 4096 Mar 12 12:14 dir/
cp@hcss-ecs-348a:~$ cd dir
cp@hcss-ecs-348a:~/dir$ touch test7.txt
cp@hcss-ecs-348a:~/dir$ ll
total 8
drwxr-xrwx 2 root root 4096 Mar 12 18:42 ./
drwxr-x--- 5 cp cp 4096 Mar 12 18:28 ../
-r--r--r-- 1 cp cp 0 Mar 12 18:48 test7.txt(这里经过处理,让我们对其没有“写”权限)
cp@hcss-ecs-348a:~/dir$ rm -f test7.txt
cp@hcss-ecs-348a:~/dir$ ll
total 8
drwxr-xrwx 2 root root 4096 Mar 12 18:43 ./
drwxr-x--- 5 cp cp 4096 Mar 12 18:28 ../
大家发现,我们对dir目录来说是other,我们拥有对其写的权限,那么我在dir目录下创建一个新文件test7.txt,此时大家注意这个文件没有写权限,但是我们还是能将它删除,所以这个现象就比较奇怪了,我不能“写”这个文件,但是却可以直接删除它,为了解决这个不合理的问题,Linux引入了粘滞位的概念。
2.2.6 粘滞位
语法: chmod +t 目录名
功能: 给目录加上粘滞位。
当一个用户将某一个目录加上粘滞位后,该目录的权限值的最后一位变为字符“t”。
修改前:
drwxr-xrwx 2 root root 4096 Mar 12 18:56 dir/
修改指令:root@hcss-ecs-348a:/home/cp# chmod +t dir
修改后:
drwxr-xrwt 2 root root 4096 Mar 12 18:56 dir/
此时我们再次来删除文件,大家会看到下面的报错:
cp@hcss-ecs-348a:~/dir$ rm -f test7.txt
rm: cannot remove 'test7.txt': Operation not permitted
这里就是粘滞位起到作用了,我们无法像上面那样去删除文件test7.txt了。
总结:
当一个目录被设置为粘滞位,则该目录下的文件只能由:
1)超级用户删除。
2)该目录的拥有者删除。
3)该文件的拥有者删除。
相关文章:
Linux——Shell运行原理以及Linux权限
目录 1. Shell的运行原理 2. Linux中的权限问题 2.1 Linux权限的概念 2.1.1 如何实现用户账号之间的切换 2.1.2 如何将普通用户添加到信任列表中 2.1.3 如何仅提升当前指令的权限 2.2 Linux权限管理 2.2.1 文件访问者的分类(人) 2.2.2 文件类型…...
SpringBoot注解驱动CRUD工具:spring-avue-plus
项目背景 作为一个后端小伙伴,最大的痛点就是写完的接口需要拥有一些可视化的页面去承载这些功能使用【如果是只给后端那么swagger也足够了,非后端有点呛】如果有专业前端去弄确实也快,但是小公司呀~~~ 学呗~妈呀,现在的前端也挺…...
Redis 数据持久化之AOF
AOF(Append Only File) 以日志的形式来记录每个写操作,将Redis执行过的所有写指令记录下来(读操作不记录),只许追加文件但不可以改写文件,redis启动之初会读取该文件重新构建数据,换…...
API调试工具的无解困境:白名单、动态IP与平台设计问题
引言 你是否曾经在开发中遇到过这样的尴尬情形:你打开了平台的API调试工具,准备一番操作,结果却发现根本无法连接到平台?别急,问题出在调试工具本身。今天我们要吐槽的就是那些神奇的开放平台API调试工具,…...
git commit messege 模板设置 (规范化管理git)
配置方法 git config --global core.editor vim (设置 Git 的默认编辑器为 Vim)在用户根目录下(~),创建一个.git_commit_msg文件,然后把下面的内容拷贝到文件中并保存。 [version][模块][类型]{解决xxx问题…...
串口通信ASCII码转16进制及C#串口编程完整源码下载
在工业自动化、嵌入式系统及物联网以行业中,串口编程非常重要。 串口编程,重点在于串口数据通信和数据处理。 在C#中,System.IO.Ports命名空间提供了SerialPort类,用于实现串口通信。 串口程序的开发主要包括以下几点 1.引用命…...
第十一届蓝桥杯单片机国赛
什么?4T模拟赛和省赛做起来轻轻松松?不妨来挑战一下第十一届国赛,这一届的国赛居然没考超声波、串口通信!只要你正确地理解了题目的意思,规避出题人挖的坑,拿个国一轻轻松松。 附件:第十一届蓝桥…...
Ateme在云端构建可扩展视频流播平台
Akamai Connected Cloud帮助Ateme客户向全球观众分发最高质量视频内容。 “付费电视运营商和内容提供商现在可以在Akamai Connected Cloud上通过高质量视频吸引观众,并轻松扩展。”── Ateme首席战略官Rmi Beaudouin Ateme是全球领先的视频压缩和传输解决方案提…...
QT系列教程(20) Qt 项目视图便捷类
视频连接 https://www.bilibili.com/video/BV1XY41127t3/?vd_source8be9e83424c2ed2c9b2a3ed1d01385e9 Qt项目视图便捷类 Qt项目视图提供了一些便捷类,包括QListWidget, QTableWidget, QTreeWidget等。我们分别介绍这几个便捷类。 我们先创建一个Qt …...
【最后203篇系列】014 AI机器人-1
说明 终于开张了,我觉得AI机器人是一件真正正确,具有商业价值的事。 把AI机器人当成一笔生意,我如何做好这笔生意?一端是业务价值,另一端是技术支撑。如何构造高质量的内容和服务,如何确保技术的广度和深度…...
cfi网络安全 网络安全hcip
目录 RIP (路由信息协议) 算法 开销 版本 开销值的计算方式 RIPV1和RIPV2的区别 RIP的数据包 Request(请求)包 Reponse(应答)包 RIP的特征 周期更新 RIP的计时器 1,周期更新计时器 2,失效计时器 3,垃圾回收计时器 RIP的核心思…...
HTML 基础
一、HTML 基本结构 <!DOCTYPE html> <html> <head><meta charset"utf-8"><title>页面标题</title> </head> <body><!-- 可见内容区域 --> </body> </html><!DOCTYPE html>:声明…...
数据结构与算法:归并排序
目录 归并排序的基本思想 归并排序的特性总结 代码 归并排序的非递归版 归并排序的基本思想 归并排序是建立在归并操作上的一种有效的排序算法。改算法是采用分治法的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列…...
Tweak Power:全方位电脑系统优化的高效工具
在日常使用电脑时,系统性能的下降、垃圾文件的堆积以及硬盘的老化等问题常常困扰着用户。为了提升电脑性能、优化系统运行,许多人会选择系统优化工具。然而,国内一些系统优化软件常常因为广告过多或功能冗杂而让人望而却步。此时,…...
stm32中分析UART中IDLE,RXNE,TC,TXE这些标志位的作用
下面将基于 STM32 标准库,结合之前提到的不同应用场景,给出使用 TXE、TC、IDLE 和 RXNE 标志位的代码示例及分析。 1. 连续数据发送(使用 TXE) 应用场景 向外部设备连续发送大量数据,如向显示屏发送显示数据、向传感…...
代码随想录算法训练营第十天,150.逆波兰表达式求值,239.滑动窗口最大值,347.前K个高频元素
今日内容:150.逆波兰表达式求值,239.滑动窗口最大值,347.前K个高频元素,栈与队列总结 心得:昨天休息了一天,栈与队列的题都比较典型,之前也是恶补过堆栈的知识,所以做起来相对kmp好一…...
【python】Flask web框架
文章目录 一、Flask 简介二、核心组件解析2.1 路由系统2. 模板引擎 (Jinja2)2.3 表单处理与请求上下文 三、现代开发实践3.1 应用工厂模式3.2 异步处理支持 四、安全最佳实践五、性能优化策略六、扩展生态精选七、部署方案对比 一、Flask 简介 Flask 是基于 Python 的微型 Web…...
Node.js:快速启动你的第一个Web服务器
Node.js 全面入门指南 文章目录 Node.js 全面入门指南一 安装Node.js1. Windows2. MacOS/Linux 二 配置开发环境1. VSCode集成 三 第一个Node.js程序1. 创建你的第一个Node.js程序 四 使用Express框架1. 快速搭建服务器 一 安装Node.js 1. Windows 以下是Windows环境下Node.j…...
3-003:在 MySQL 中建索引时需要注意哪些事项?
在 MySQL 中创建索引时,需要注意以下事项,以确保索引高效且合理: 1. 选择合适的索引类型 主键索引(PRIMARY KEY):每个表只能有一个,默认是聚簇索引。唯一索引(UNIQUE)&…...
基于WPF的雷达上位机系统开发实践
一、雷达上位机系统概述 1.1 系统功能需求 现代雷达上位机系统通常需要实现以下核心功能模块: 数据采集与解析 支持多种通信协议(TCP/IP、UDP、RS422等) 实时解析雷达原始数据(目标距离、方位、速度、RCS等) 典型数…...
版本号标识
Visual Studio 16 2019 是 Microsoft Visual Studio 2019 的版本号标识。具体来说: Visual Studio 是微软提供的一款集成开发环境(IDE),用于开发各种应用程序,如桌面软件、Web 应用、移动应用等,支持多种编…...
计算机考研C语言
C语言程序设计从入门到精通【2025完整版】考研复试 嵌入式 计算机二级 软考 专升本也适用_哔哩哔哩_bilibili 1、第一个C程序 helloC #include <stdio.h>int main(){printf("hehe");return 0;}每个C语言程序不管有多少行代码,都是从main函数开始执…...
STM32 内置的通讯协议
数据是以帧为单位发的 USART和UART的区别就是有没有同步功能 同步是两端设备有时钟连接,异步是没时钟连接,靠约定号的频率(波特率)接收发送数据 RTS和CTS是用来给外界发送已“可接收”或“可发送”信号的,一般用不到…...
QT:串口上位机
创建工程 布局UI界面 设置名称 设置数据 设置波特率 波特率默认9600 设置数据位 数据位默认8 设置停止位 设置校验位 调整串口设置、接收设置、发送设置为Group Box 修改配置 QT core gui serialport 代码详解 mianwindow.h 首先在mianwindow.h当中定义一个串口指…...
f QT测试
# 添加 Qt Test 模块,用于支持单元测试功能 QT testlib# 添加 Qt 的核心模块和 GUI 模块,这是构建 Qt 应用程序的基础模块 QT core gui# 如果 Qt 的主版本号大于 4,则添加 widgets 模块。 # 这是因为 Qt Widgets 模块是从 Qt 5 开始引…...
vue3在ts中动态添加DOM(1、使用render函数,2、使用tsx)
1、使用render函数和h函数 h函数创建虚拟节点(VNode),render函数实现虚拟节点生成真实DOM元素 实现添加一个el-button按钮 <script setup lang"ts"> import { ElButton } from "element-plus"; //需要在页面中引…...
C++基础(VScode环境安装)
MinGW Distro - nuwen.net 安装完成之后我们打开刚刚的安装路径,找到并打开MinGW -> bin,进入bin文件夹之后点一下这里,右键复制路径 之后我们进入设置,搜索“环境变量”,选择“编辑系统环境变量” 按WinR,输入cmd࿰…...
MySQL:SQL优化实际案例解析(持续更新)
文章目录 一、MySQL:SQL优化1、时间格式化问题(字符串)2、in/inner join的问题 一、MySQL:SQL优化 1、时间格式化问题(字符串) -- 优化前 SELECT * FROM test_table WHERE date_format( begin_time, %Y-%…...
代理(Delegate)、闭包(Closure)、Notification(通知中心) 和 swift_event_bus适用场景和工作方式
在 Swift 开发中,在 Swift 开发中,代理(Delegate)、闭包(Closure)、Notification(通知中心) 和 swift_event_bus 主要用于 组件之间的通信,但它们的适用场景和工作方式有…...
力扣第585题
with t as (select *, count(tiv_2015) over(partition by tiv_2015) cnt1 , count(*) over(partition by lat,lon) cnt2 from insurance) select round(sum(tiv_2016),2) tiv_2016 from t where cnt1>1 and cnt21; 以上代码的思路: ①明确查询需求:…...
C++学习——顺序表(四)
文章目录 前言一、最大连续1的个数二、差的绝对值为K的数对数目三、数组中两元素的最大乘积四、数组元素和与数字和的绝对值的差五、K个元素的最大和六、等差三元组的数目七、移除元素 前言 本文为《C学习》的第14篇文章,今天通过Leetcode的几道题来熟悉顺序表的大…...
java虚拟机(JVM)以及各种参数详解
Java 虚拟机(JVM)提供了许多参数来调整其行为和性能,以便更好地适应不同的应用场景。理解和使用这些参数对于优化 Java 应用程序的性能非常重要。以下是一些常用的 JVM 参数及其详细说明: 1. 内存管理参数 -Xms<size>&…...
Android电量与流量优化
Android电量与流量优化 一、电量优化基础 1.1 电量消耗原理 Android设备的电量消耗主要来源于以下几个方面: 屏幕显示:屏幕是耗电量最大的硬件之一,尤其是高亮度和高刷新率的屏幕。CPU处理:CPU执行计算任务时会消耗大量电量,尤其是高负载运算。网络通信:移动数据、Wi-…...
机器人运动学与动力学
在当今科技飞速发展的时代,机器人已逐渐渗透到我们生活的方方面面,从工业生产线上的高效作业,到医疗领域的精准辅助,再到家庭服务的贴心陪伴,机器人技术的广泛应用正深刻改变着我们的生活和工作方式。而在机器人技术的…...
【web前端开发】HTML排版标签、HTML语义化标签、常用的文本标签
1、HTML排版标签 标签名 标签含义 单/双标签 h1~h6 …...
Linux的TTY子系统(TTY框架)的重要结构体termios的`c_iflag`字段的BRKINT选项和IGNBRK选项的含义【详解串口的BREAK信号】
引言 要搞清楚结构体termios的c_iflag字段的BRKINT选项和IGNBRK选项的含义,首先要搞清楚BREAK信号的含义。其实当你搞清楚BREAK信号后,结构体termios的c_iflag字段的BRKINT选项和IGNBRK选项的含义你也就自然知道了。 1. 什么是 BREAK 信号?…...
YashanDB认证,YCA证书认证教程,免费证书,内含真题考试题库及答案——五分钟速成
目录 一.账号及平台注册登录流程 二.登录进行设备调试核验 三.考试(考完获取分数) 四.获取证书 五.题库及答案 一.账号及平台注册登录流程 1-点击这里进行账号注册(首次学习必须先注册,有账号之后可以直接在2号链接登录&#…...
网络爬虫-1:发送请求+维持会话+代理设置/超时设置
1.基于get发送请求 2.基于post发送请求 3.维持会话 4.代理设置/超时设置 一.基于get发送请求 1.获取网页源码1 使用json库中的json.loads(),将json格式的字符串变为Python的字典形式 以下通过http://httpbin.org/get网址进行基本练习操作 import requests import json urlh…...
VSCode 配置优化指南:打造极致高效的前端开发环境
VSCode 配置优化指南:打造极致高效的前端开发环境 一、基础环境配置:让开发更流畅 1. 性能优化设置 // settings.json {"files.autoSave": "afterDelay", // 自动保存(延迟1秒)"files.exclud…...
【实战-解决方案】Webpack 打包后很多js方法报错:not defined
问题分析 在不打包的情况下,方法(如 checkLoginStatus、filterSites、initProgressBar 等)可以正常运行,而经过 Webpack 打包后报 is not defined 错误,通常有以下几个可能的原因: 全局变量丢失 在 Webpac…...
第16届计算智能与软件工程国际研讨会(CISE 2026)
第16届计算智能与软件工程国际研讨会(CISE 2026) The 16th Intl Conference on Computational Intelligence and Software Engineering(CISE 2026) 时间:2026年1月9-11日 地点:中国 三亚 邮箱投稿:editor1academicx.org 检索࿱…...
laravel中 添加公共/通用 方法/函数
一,现在app 下面创建Common目录,然后在创建Common.php 文件 二,修改composer.json文件 添加这个到autoload 中 "files": ["app/Common/Common.php"]"autoload": {"psr-4": {"App\\": &quo…...
Android 自定义View之底部导航栏
文章目录 Android 自定义View之底部导航栏概述代码定义TabIndex定义Tab定义TabView定义NavigationBarFragmentSwitchHelper管理类使用 源码下载 Android 自定义View之底部导航栏 概述 封装一个通用的底部导航栏控件。 代码 定义TabIndex Retention(AnnotationRetention.SOU…...
[Kubernetes] 7控制平面组件
1. 调度 kube- scheduler what 负责分配调度pod到集群节点监听kube-apiserver,查询未分配node的pod根据调度策略分配这些pod(更新pod的nodename)需要考虑的因素: 公平调度,资源有效利用,QoS,affinity, an…...
定时器Tim输出比较(output compare)
输出比较OC(Output Compare) 输出比较可以通过比较CNT与CCR寄存器值的关系,来对输出电平进行置1、置0或翻转的操作,用于输出一定频率和占空比的PWM波形 每个高级定时器和通用定时器都拥有4个输出比较通道,高级定时器的前3个通道额外拥有死区生…...
Linux Shell 脚本编程极简入门指南
一、学习前提准备 ✅ 环境要求: Linux系统(Ubuntu/CentOS等)或 WSL (Windows用户) 任意文本编辑器(推荐VSCode/Vim) 基础命令行操作能力 🔍 验证环境: # 查看系统默认Shell echo $SHELL #…...
C++:二分习题
1. 借教室 503. 借教室 - AcWing题库 在大学期间,经常需要租借教室。 大到院系举办活动,小到学习小组自习讨论,都需要向学校申请借教室。 教室的大小功能不同,借教室人的身份不同,借教室的手续也不一样。 面对海…...
【AIGC】计算机视觉-YOLO系列家族
YOLO系列家族 (1)YOLO发展史(2) YOLOX(3) YOLOv6(4) YOLOv7(5) YOLOv8(6) YOLOv9(7)YOLOv10(8&…...
浅谈SSE爬虫
什么是SSE SSE(Server-Sent Events,服务器推送事件)是一种用于在Web应用程序中实现单向实时数据传输的技术。它允许服务器通过HTTP连接向客户端(通常是浏览器)推送更新的数据,而无需客户端主动请求。 目前主流的大模型 就是采用的 SSE,想deepseek、chatgpt、通以千问。…...
Goland如何玩依赖注入——基于gone@v2创建一个service
经过多天的工作,终于把gone2的beta版本发布出去了。在v2版本中,做了很多更新,最大的改进是将一些不必要的概念给隐藏起来了,提供了Provider机制…… 文章目录 1. 安装**gonectr**2.创建项目2.1 项目结构 2.2 简单说明3. 启动项目…...