优先级与环境变量的艺术:驾驭 Linux 系统的核心

news2025/7/11 9:39:31

在这里插入图片描述

文章目录

  • 前言
    • 一、什么是进程优先级?
    • 二、Linux 系统中的优先级
      • 2.1 查看进程优先级
      • 2.2 PRI 和 NI 的关系
      • 2.3 修改进程优先级
      • 2.4 进程优先级的实现原理
      • 2.5 进程的特性
    • 三、环境变量
      • 3.1 PATH——搜索可执行文件的目录列表
        • 1. 为什么自己写的程序需要加 `./` 才能执行?
        • 2. 为什么执行指令时不需要加路径?
        • 3. 如何查看和修改 `PATH`?
      • 3.2 HOME——表示当前用户的主目录路径
        • 1. 什么是 `HOME`?
        • 2. 作为默认工作目录
        • 3. 查看 `HOME` 环境变量的值
      • 3.3 USER——存储当前登录用户的用户名
        • 1. 示例代码 1:打印当前用户
        • 2. 示例代码 2:判断用户权限
        • 3. USER 与权限认证
    • 四、命令行参数
      • 4.1 什么是命令行参数?
      • 4.2 main 函数的形式
      • 4.3 命令行参数的作用
      • 4.4 main函数的第三个参数
      • 4.5 环境变量的继承
        • 验证子进程继承环境变量
    • 五、本地变量与内建命令
      • 5.1 为什么 `echo` 能打印本地变量
  • 结语


前言

在 Linux 系统中,进程和环境变量是操作系统的核心组成部分。进程优先级决定了资源分配的先后顺序,直接影响系统性能;而环境变量则提供了一种灵活的方式,用于传递系统配置信息以及控制程序的运行环境。本篇文章将深入探讨进程优先级的概念、调节方法及其原理,以及环境变量的定义、特性和实际应用,帮助读者更好地理解 Linux 系统的核心机制,从而在实际工作中更高效地调试和优化系统。


一、什么是进程优先级?

  1. 优先级的定义
    • 优先级决定了多个进程竞争 CPU 时,哪个进程优先获得 CPU 时间片。
    • 区别于权限,权限决定能不能执行某个任务,而优先级决定谁先执行
  2. 优先级的作用
    • 通过优先级机制,操作系统能够公平地分配 CPU 资源,防止某些进程长期得不到 CPU 的问题(即进程饥饿问题)。
    • 例如:
      • 高优先级进程(实时任务)可以更快地执行。
      • 低优先级进程可能被推迟,但不会被饿死(通过调度算法保证)。
  3. 小结
    • CPU 资源分配的先后顺序由优先级决定。
    • Linux 的调度器根据优先级动态调度进程,提高系统的整体性能。

二、Linux 系统中的优先级

2.1 查看进程优先级

示例代码

#include <stdio.h>
#include <unistd.h>

int main() {
    while (1) {
        printf("I am a process, PID:%d, PPID:%d\n", getpid(), getppid());
        sleep(1);
    }
    return 0;
}

运行步骤

  1. 编译运行程序:

    gcc process.c -o process
    ./process
    
  2. 打开另一个终端,查看进程的优先级:

    ps -al | head -1 ; ps -al | grep process
    

在这里插入图片描述
输出字段解析

  • UID:表示进程的执行者身份。
  • PID:当前进程的 ID。
  • PPID:当前进程的父进程 ID。
  • PRI:进程的优先级值,值越小优先级越高。
  • NI:进程的 nice 值,调整优先级的修正值。

2.2 PRI 和 NI 的关系

  1. PRI(Priority)

    • 表示进程的实际优先级,值越小优先级越高。
    • Linux 调度器根据 PRI 值决定哪个进程优先执行。
  2. NI(Nice 值)

    • 是进程优先级的修正值,用户可以通过调整 nice 值来影响 PRI 值。
    • nice 值范围:
      • [-20, 19],共 40 个级别。
      • 默认值是 0
    • nice 值的影响:
      • 负数:提高优先级(PRI 值减小)。
      • 正数:降低优先级(PRI 值增大)。
  3. 关系公式

    PRI(new) = PRI(old) + nice
    
    • PRI(old):系统默认优先级,起始值为 80
    • nice 值:用户设置的调整值。
  4. 举例

    • 默认情况下(nice=0),PRI 值为 80。

    • 如果 nice=-10,则:

      PRI = 80 + (-10) = 70  (优先级提高)
      

在这里插入图片描述

2.3 修改进程优先级

  1. 查看进程优先级(top 命令)

    • 使用 top 实时监控系统进程:

      top
      
    • 找到目标进程的 PID

  2. 修改优先级

    • top 中,按下 r 键。
    • 输入目标进程的 PID
    • 输入新的 nice 值(范围:-20 至 19)。
  3. 命令行方式修改

    • 启动新进程并设置 nice 值

      nice -n <nice值> ./process
      

      示例:

      nice -n -10 ./process
      
    • 调整运行中的进程

      renice <nice值> -p <PID>
      

      示例:

      renice -5 -p 12345
      
  4. 注意

    • 只有 root 用户 可以设置负的 nice 值(提高优先级)。
    • 普通用户只能降低优先级。

2.4 进程优先级的实现原理

  1. 进程控制块(PCB)
    • 每个进程在内核中对应一个 task_struct 结构体(即进程控制块)。
    • task_struct 中包含进程的优先级、状态等信息。
  2. 优先级队列
    • 系统根据进程的 PRI 值将其加入对应的优先级队列。
    • 修改优先级的本质:
      • 当调整进程的 nice 值时,内核会将该进程从当前队列移出,并重新加入新的优先级队列。

2.5 进程的特性

  • 竞争性:系统进程数目众多,而 CPU 资源只有少量,甚至1个,所以进程之间是具有竞争属性的。为了高效完成任务,更合理竞争相关资源,便具有了优先级。

  • 独立性:多进程运行,需要独享各种资源,多进程运行期间互不干扰。

  • 并行:多个进程在多个 CPU 下分别同时运行,这称之为并行。

  • 并发:多个进程在一个 CPU 下采用进程切换的方式,在一段时间之内,让多个进程都得以推进,称之为并发。

并发情况下, 操作系统会根据每个进程的时间片进行进程间的切换,只要当前正在被 CPU 调度的进程的时间片到了,无论有没有执行结束,都会被操作系统从 CPU 上拿下来,放到 waiting 数组中去排队,等待 CPU 的下一次调度,我们把这种过程叫做进程基于时间片轮转的调度算法。

两个问题:

1.为什么函数返回值,会被外部拿到呢?

函数调用过程中,栈会保存必要的信息,包括返回地址、参数和局部变量等。

返回值通过寄存器或栈上的特定位置传递给调用者:

  • 如果返回值是通过栈返回,调用者会在栈上预留一块区域,函数直接将返回值写入这块区域。
  • 在调用完成后,调用者通过栈指针或其他方法从指定位置获取返回值。

2.系统如何得知进程当前执行到哪一行代码了?

CPU 中的程序计数器寄存器 ( PC 或者 eip ) 保存着当前正在执行指令的地址。每次指令执行完毕,程序计数器会自动递增(或根据控制流指令,如 jmpcallret 等更新),以指向下一条需要执行的指令。

补充知识:寄存器

  • CPU 中的寄存器有很多种,例如:通用寄存器 eax、ebx、ecx、edx;和栈帧有关的寄存器 ebp、esp、eip;和状态有关的寄存器 status。

  • 寄存器扮演什么角色?提高效率,进程的高频数据会放入寄存器中。

  • 寄存器也有对数据保存的能力,计算机在运行时一些重要的数据一定要保存在 CPU 内部,即寄存器中,因为寄存器离 CPU 很近且存储效率高,所以 CPU 内的寄存器保存的是进程相关的数据,可以随时被 CPU 访问或者修改,这种和进程有关的数据也被叫做进程的上下文。

  • 进程在 CPU 上离开时要将自己的上下文数据保存好,甚至带走,这样做的目的是为了未来“回来”的时候进行恢复。进程在被切换的时候有两步:**1. 保存上下文,2. 恢复上下文。**进程的上下文数据量并不大,一般可以直接保存到进程的 PCB 对象中,当 CPU 再次调度该进程的时候,将这些上下文数据再恢复到寄存器里面即可。

三、环境变量

环境变量是操作系统用于存储系统范围内或用户特定信息的键值对,通常用于配置系统和应用程序运行时的行为。通过设置和读取环境变量,操作系统、开发工具和应用程序能够更灵活地响应不同的运行环境。
在这里插入图片描述
上图是 Windows 系统下的环境变量,本质上就是一组键值对,接下来将演示 Linux 系统下常见的环境变量。

3.1 PATH——搜索可执行文件的目录列表

1. 为什么自己写的程序需要加 ./ 才能执行?
  • 默认搜索路径中没有当前目录:当前目录(.)通常并不包含在 PATH 环境变量中。这是为了避免安全隐患(防止恶意程序通过伪造指令干扰系统)。

  • ./ 的作用:加 ./ 明确告诉系统,程序位于当前目录下。例如:

    ./my_program
    

    表示运行当前目录下名为 my_program 的程序。

2. 为什么执行指令时不需要加路径?
  • 指令(如 lscat)的本质:它们是存放在系统目录中的可执行程序,通常位于 /usr/bin//bin/ 等目录下。

  • PATH 环境变量:Linux 系统通过 PATH 环境变量来指定一系列目录,当你在终端输入指令时,系统会按照 PATH 中定义的目录顺序,依次查找该指令对应的可执行程序。

  • 查找过程

    • 输入 ls 时,系统会在 PATH 的所有目录中搜索 ls 对应的程序(如 /usr/bin/ls),一旦找到,就直接执行。
    • 如果未找到,系统会报错 command not found
3. 如何查看和修改 PATH

1. 查看 PATH

echo $PATH

输出示例:

在这里插入图片描述
表示系统会依次在 /usr/local/bin/usr/bin/bin 等目录中查找命令。

2.临时添加路径到 PATH

PATH=$PATH:/home/xny/linux/lesson13
  • /home/xny/linux/lesson13 是当前工作目录。
  • $PATH 表示保留原有的搜索路径,不覆盖。
  • 该修改仅对当前终端有效,关闭终端后会恢复默认。
    在这里插入图片描述
    此时我们当前的工作目录也被添加了进去,此时在该目录下的可执行程序在执行的时候就可以不加 ./ 了。
    在这里插入图片描述
    如图所示,mycmd可以直接当作命令使用了。

3.2 HOME——表示当前用户的主目录路径

1. 什么是 HOME

HOME 是 Linux 系统中的一个环境变量,它表示当前用户的主目录路径。主目录是每个用户的个人工作空间,用于存储用户的配置文件、文档、下载文件等。不同的用户拥有各自的主目录,彼此隔离。

  • 普通用户的 HOME 路径:通常位于 /home/username
  • 超级用户(root)的 HOME 路径:默认为 /root
2. 作为默认工作目录
  • 用户登录系统时,Shell 默认进入 HOME 目录。
  • 输入 cd(不带参数)或 cd ~ 时,都会切换到 HOME 目录。
3. 查看 HOME 环境变量的值
echo $HOME

示例输出:
在这里插入图片描述
我们可以通过 env 指令查看当前 bash 从操作系统中继承下来的所有环境变量。
在这里插入图片描述
除了使用 env 指令,我们还可以通过 getenv 这个系统调用接口来获取某个环境变量的值。

3.3 USER——存储当前登录用户的用户名

USER 是一个系统环境变量,用来存储当前登录用户的用户名。Linux 系统依赖此变量来标识当前用户,并根据其权限级别(如普通用户或 root 用户)提供不同的访问权限。

1. 示例代码 1:打印当前用户
#include <stdio.h>
#include <stdlib.h>

int main()
{
    printf("USER: %s\n", getenv("USER"));
    return 0;
}

解释:

  1. getenv("USER")

    • 调用 C 标准库函数 getenv 获取环境变量 USER 的值,即当前登录用户的用户名。
  2. 打印结果:

    • 不同用户运行此程序时,会得到各自的用户名。例如:

      USER: root
      

      USER: john
      
2. 示例代码 2:判断用户权限
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main()    
{    
    char user[32];    
    strcpy(user, getenv("USER"));    
    if(strcmp("root", user) == 0)    
    {    
        printf("root用户,不受权限约束\n");    
    }    
    else    
    {    
        printf("普通用户,受权限约束\n");    
    }    
    printf("USER: %s\n", getenv("USER"));    
    return 0;                                                                 
}    

功能:

  1. 读取环境变量 USER
    • 使用 getenv("USER") 获取当前登录用户名。
    • 将用户名存储在 user 字符数组中。
  2. 判断是否为 root 用户:
    • 使用 strcmp 函数对比用户名是否为 root
    • 如果是 root,则打印 “root用户,不受权限约束”。
    • 如果不是,则打印 “普通用户,受权限约束”。
  3. 打印当前用户:
    • 再次打印当前用户的用户名。

运行结果示例:

  • 如果 root 用户运行程序:

    root用户,不受权限约束
    USER: root
    
  • 如果普通用户(如 john)运行程序:

    普通用户,受权限约束
    USER: john
    
3. USER 与权限认证
  1. 系统权限判断:
    • Linux 系统会使用当前用户的 USER 变量与文件的拥有者和权限信息进行对比,判断当前用户是否有权访问或修改文件。
  2. 权限模型:
    • 每个文件或目录都有三类权限:
      • 拥有者(Owner):文件的所有者。
      • 所属组(Group):文件所属的用户组。
      • 其他用户(Other):不属于以上两类的用户。
    • 权限分为三种:
      • 读(r)、写(w)、执行(x)。
  3. USER 的实际作用:
    • 当用户执行某些操作(如访问文件、运行程序)时,系统会获取 USER 变量的值,判断当前用户是否有对应权限。例如:
      • 如果是 root 用户,通常不受权限限制。
      • 如果是普通用户,则需要对比权限位。

四、命令行参数

4.1 什么是命令行参数?

命令行参数是指在运行程序时通过命令行传递给程序的参数。它们使程序可以接受外部输入,从而改变程序的行为或处理不同的数据。

在 C/C++ 中,命令行参数通过 main 函数的参数 argcargv 获取:

  • argc(argument count):参数的数量。
  • argv(argument vector):一个字符串数组,每个元素是一个参数的值。

4.2 main 函数的形式

int main(int argc, char *argv[])
  • argc:表示参数的个数,包括程序本身的名称。
    • 如果程序运行时没有额外参数,则 argc 值为 1。
  • argv:一个指针数组,存储每个参数的字符串。
    • argv[0]:始终是程序的名称(包含路径)。
    • argv[1]argv[argc-1]:表示传递给程序的实际参数。
int main(int argc, char* argv[])    
{    
    int i = 0;    
    for(; i < argc; i++)    
    {    
        printf("argv[%d]->%s\n",i, argv[i]);    
    }    
    return 0;    
} 

运行示例:
在这里插入图片描述
命令行参数通过以下方式传递给程序:

  • 当我们在命令行输入 ./mycode -a -b -c 时,bash 会将这整行输入当作一个字符串。
  • 然后,bash 使用空格作为分隔符,将字符串拆分成单独的部分。
  • 拆分后的部分作为字符串,存储在一个字符串数组中,这个数组的首地址传递给 argv,其大小传递给 argc
  • argv 是一个指针数组,其最后一个元素会自动被设置为 NULL,用来标识参数结束。这种设计的好处是方便程序在处理参数时快速检测结束标志,而不用依赖 argc

4.3 命令行参数的作用

命令行参数的一个重要作用是为程序、指令或工具提供灵活的选项支持,以便实现不同的功能或行为。

#include <stdio.h>
#include <string.h>

int main(int argc, char* argv[])    
{    
    if (argc != 2) {  // 参数数量校验
        printf("./mycode [-a|-b|-c|-d]\n");
        return 0;
    }    
    
    if (strcmp(argv[1], "-a") == 0) {  // 判断第一个参数是否为 "-a"
        printf("功能1\n");
    } else if (strcmp(argv[1], "-b") == 0) { 
        printf("功能2\n");
    } else if (strcmp(argv[1], "-c") == 0) { 
        printf("功能3\n");
    } else if (strcmp(argv[1], "-d") == 0) { 
        printf("功能4\n");
    } else { 
        printf("功能5\n");
    }
        
    return 0;    
}

运行示例:
在这里插入图片描述
命令行参数有一个重要的作用,它可以为指令、工具、软件等提供命令行选项的支持。

4.4 main函数的第三个参数

除了上面提到的 argcargv 两个参数,main 函数还有第三个参数 env,它也是一个指针数组,存放的是该进程的环境变量。

#include <stdio.h>
int main(int argc, char* argv[], char* env[])    
{    
    int i = 0;    
    for (; env[i]; i++) {    
        printf("env[%d] -> %s\n", i, env[i]);    
    }
    
    return 0;   
}

在这里插入图片描述

  • 在 C/C++ 中,程序通常会使用两张核心向量表:

    1. 命令行参数表(argcargv

      • 用于接收用户通过命令行传递的参数。
      • 提供了程序运行时的输入灵活性和动态控制能力。
    2. 环境变量表(env

      • 用于存储操作系统中的全局配置信息。
      • 包含用户信息、语言设置、路径变量等,且由父进程传递给子进程。
  • 运行指令与程序的关系:

    1. 命令行参数

      • 每个命令行指令都会拆解为多个部分,分别存储在 argv 数组中。
      • 程序运行时可以通过 argvargc 获取这些参数,并根据参数执行不同的功能。
    2. 环境变量继承

      • 当我们在 bash 中运行程序时,bash 作为父进程会将其环境变量传递给程序(子进程)。

      • 这使得程序可以通过读取环境变量动态适应运行环境。

4.5 环境变量的继承

验证子进程继承环境变量

设置环境变量 在 Bash 中执行以下命令:

export MY_VALUE=12345678
  • 通过 export 将本地变量转化为环境变量。

然后再查看当前的环境变量:
在这里插入图片描述
下面执行子进程 ./mycmd,可以发现它里面也有 MY_VALUE 这个环境变量,说明子进程 mycmd 继承了父进程 bash 的环境变量。
在这里插入图片描述
正是因为子进程可以继承父进程的环境变量,所以我们在 bash 输入的所有指令都要遵守权限,因为输入的所有指令都可以看做是 bash 的子进程,都继承了 bash 的环境变量。通过下面这条指令可以删除环境变量。

unset MY_VALUE

五、本地变量与内建命令

本地变量:就是在命令行中直接定义的变量。

  • 本地变量是通过 bash 命令行直接定义的,仅在当前 bash 会话中有效。
  • 本地变量不能被子进程继承。

环境变量

  • 环境变量是可以被子进程继承的变量。
  • 通过 export 将本地变量转化为环境变量。
    在这里插入图片描述

查看所有变量:使用 set 查看:

set

在这里插入图片描述

5.1 为什么 echo 能打印本地变量

我们可以通过 echo 指令打印出本地变量,之前说过 echo 作为指令,本质上也是一个可执行程序,既然是可执行程序,那就会创建进程,但是我们又说了子进程是无法继承父进程的本地变量,那为什么 echo 可以打印出父进程 bash 的本地变量呢?

本地变量的作用域:仅在当前 bash 会话中有效。

echo 是内建命令:直接由 bash 执行,不创建子进程,因此可以访问 bash 的本地变量。

内建命令与常规命令

bash 中的指令可以分为两类:

  1. 常规命令
    • 通过创建子进程执行的外部程序。
    • 示例:
      • ls:使用 fork 创建子进程,然后执行 execve 加载外部程序。
  2. 内建命令
    • bash 自身直接实现,不会创建子进程。
    • 示例:
      • echocdexportset 等。

echo 就是一个内建命令,执行 echo 命令的时候并不会创建子进程.

同样的,cd 也是一个内建命令,用于切换当前工作目录。其本质是调用系统接口 chdir(),直接改变当前进程的工作目录。

除了上面提到的两种通过代码获取环境变量的方法(命令行第三个参数、getenv系统接口)外,还可以通过全局变量 environ获取

  • libc 提供的全局变量 environ,指向环境变量表。
  • 需要 extern 显式声明后使用:
#include <stdio.h>
int main(int argc, char *argv[])
{
	extern char **environ;
	int i = 0;
	for(; environ[i]; i++)
	{
		printf("%s\n", environ[i]);
	}
	return 0;
}

结语

通过对进程优先级和环境变量的深入学习,我们可以发现,它们在 Linux 系统中扮演着不可或缺的角色。进程优先级确保了多任务系统中资源的公平竞争和高效利用,而环境变量为系统和用户程序的交互提供了灵活性和动态配置的能力。掌握它们不仅能帮助我们优化系统性能,还能提升在日常开发和运维中的效率。希望通过本篇文章,能够让您对 Linux 系统的运行机制有更深入的认识,助力您的学习与实践。
在这里插入图片描述

今天的分享到这里就结束啦!如果觉得文章还不错的话,可以三连支持一下,17的主页还有很多有趣的文章,欢迎小伙伴们前去点评,您的支持就是17前进的动力!

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2320001.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【AVRCP】深度剖析 AVRCP 中 Generic Access Profile 的要求与应用

目录 一、GAP基础架构与核心要求 1.1 GAP在蓝牙体系中的定位 1.2 核心模式定义 二、AVRCP对GAP的增强要求 2.1 模式扩展规范 2.2 空闲模式过程支持 三、安全机制实现细节 3.1 认证与加密流程 3.2 安全模式要求 四、设备发现与连接建立 4.1 发现过程状态机 4.2 连接…

聊聊如何保障自动化测试的稳定性

目录 一、环境隔离与控制 二、 测试用例设计原则 三、处理异步和动态内容 四、依赖管理 五、错误处理与日志 六、持续集成&#xff08;CI&#xff09;与自动化流程 七 、监控与维护 八、团队协作与文化 在我们进行自动化测试的时候&#xff0c;可能会遇到一些测试环境不…

【AI学习笔记】Coze平台实现将Excel文档批量导入数据库全过程

背景前摇&原视频教程&#xff1a; 最近看到很多同学都在用Coze平台操作数据&#xff0c;我也想了解一下工作流的搭建和数据处理过程&#xff0c;但是一下子又看不懂太复杂的逻辑&#xff0c;于是上B站搜索相关的基础教程。 Coze官方教程&#xff1a; 之前有看过Coze平台…

《可爱风格 2048 游戏项目:HTML 实现全解析》

一、引言 在如今的数字化时代&#xff0c;小游戏以其简单易上手、趣味性强的特点深受大家喜爱。2048 游戏作为一款经典的数字合并游戏&#xff0c;拥有庞大的玩家群体。本文将详细介绍一个用单文件 HTML 实现的可爱风格 2048 游戏项目&#xff0c;它不仅具备传统 2048 游戏的基…

HR人员和组织信息同步AD域服务器实战方法JAVA

HR人员和组织信息同步AD域服务器 前期准备AD域基础知识整理HR同步AD的逻辑代码结构配置文件设置启动类HR组织的BeanHR人员Bean获取HR人员和组织信息的类AD中处理组织和人员的类日志配置 POM.xml文件生成EXE文件服务器定时任务异常问题注意事项 前期准备 1、开发语言&#xff1…

java项目之基于ssm的毕业论文管理系统(源码+文档)

项目简介 毕业论文管理系统实现了以下功能&#xff1a; 本毕业论文管理系统主要实现的功能模块包括学生模块、导师模块和管理员模块三大部分&#xff0c;具体功能分析如下&#xff1a; &#xff08;1&#xff09;导师功能模块&#xff1a;导师注册登录后主要功能模块包括个人…

4小时速通shell外加100例

&#x1f525; Shell 基础——从入门到精通 &#x1f680; &#x1f331; 第一章&#xff1a;Shell&#xff0c;简单说&#xff01; &#x1f476; 什么是Shell&#xff1f;它到底能做什么&#xff1f;这章让你快速了解Shell的强大之处&#xff01; &#x1f476; 什么是Shell…

文字变央视级语音转换工具

大家在制作短视频、广告宣传、有声读物、自媒体配音、学习辅助等场景的时候&#xff0c;经常会需要用到配音来增强视频的表现力和吸引力。然而&#xff0c;市面上的一些配音软件往往需要收费&#xff0c;这对于很多初学者或者预算有限的朋友来说&#xff0c;无疑增加了一定的负…

日志2333

Pss-9 这一关考察的是时间盲注 先练习几个常见命令语句&#xff1a; select sleep(5);--延迟5s输出结果 if &#xff08;1>0,ture,false&#xff09;;--输出‘ture’ /if &#xff08;1<0,ture,false&#xff09;;--输出‘false’ select ascii()/select ord()返回字…

美国国家数据浮标中心(NDBC)

No.大剑师精品GIS教程推荐0地图渲染基础- 【WebGL 教程】 - 【Canvas 教程】 - 【SVG 教程】 1Openlayers 【入门教程】 - 【源代码示例 300】 2Leaflet 【入门教程】 - 【源代码图文示例 150】 3MapboxGL【入门教程】 - 【源代码图文示例150】 4Cesium 【入门教程】…

【计算机网络】网络简介

文章目录 1. 局域网与广域网1.1 局域网1.2 广域网 2. 路由器和交换机3. 五元组3.1 IP和端口3.2 协议3.3 协议分层 4. OSI七层网络协议5. TCP/IP五层模型5.1 TCP/IP模型介绍5.2 网络设备所在分层 6. 封装与分用6.1 数据包的称谓6.2 封装6.3 分用 1. 局域网与广域网 1.1 局域网 …

Vue.js 模板语法全解析:从基础到实战应用

引言 在 Vue.js 的开发体系中&#xff0c;模板语法是构建用户界面的核心要素&#xff0c;它让开发者能够高效地将数据与 DOM 进行绑定&#xff0c;实现动态交互效果。通过对《Vue.js 快速入门实战》中关于 Vue 项目部署章节&#xff08;实际围绕 Vue 模板语法展开&#xff09;…

bootstrap 表格插件bootstrap table 的使用经验谈!

最近在开发一个物业管理软件&#xff0c;其中用到bootstrap 的模态框。同时需要获取表格数据。用传统的方法&#xff0c;本人不想用&#xff0c;考虑到bootstrap应该有获取表格数据的方法&#xff0c;结果发现要想实现获取表格数据功能&#xff0c;需要通过bootstrap的插件实现…

Spring Boot框架识别

1. 通过icon图标进行识别 2、如果 web 应用开发者没有修改 SpringBoot Web 应用的默认 4xx、5xx 报错页面&#xff0c;那么当 web 应用程序出现 4xx、5xx 错误时&#xff0c;会报错如下图&#xff1a; 其他页面 工具一把梭哈

【MySQL】【已解决】Windows安装MySQL8.0时的报错解决方案

一、引言 先说一些没用的话&#xff0c;据说安装MySQL是无数数据库初学者的噩梦&#xff0c;我在安装的时候也是查了很多资料&#xff0c;看了很多博客&#xff0c;但是很多毕竟每个人的电脑有各自不同的情况&#xff0c;大家的报错也不尽相同&#xff0c;所以也是很长时间之后…

MES汽车零部件制造生产监控看板大屏

废话不多说&#xff0c;直接上效果 预览效果请在大的显示器查看&#xff0c;笔记本可能有点变形 MES汽车零部件制造生产监控看板大屏 纯html写的项目结构如下 主要代码分享 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UT…

晶鑫股份迈向敏捷BI之路,永洪科技助力启程

数据驱动的时代&#xff0c;每一次技术的创新和突破都在为企业的发展注入新的动力。而敏捷性也不再是选择&#xff0c;是企业生存与发展的必要条件。作为连续5年获得中国敏捷BI第一名的永洪科技&#xff0c;通过不断地在数据技术领域深耕细作&#xff0c;再次迎来了行业内的关注…

Browser Use Web UI 本地部署完全指南:从入门到精通

文章目录 引言一、项目概述1.1 核心功能1.2 技术特点 二、环境准备2.1 系统要求2.2 必要工具 三、详细部署步骤3.1 获取项目代码3.2 配置 Python 环境3.3 安装项目依赖3.4 环境配置3.5 启动应用 四、DeepSeek-V1 模型配置4.1 基础配置 五、执行Browser Use六、故障排查指南6.1 …

Linux 内核源码阅读——ipv4

Linux 内核源码阅读——ipv4 综述 在 Linux 内核中&#xff0c;IPv4 协议的实现主要分布在 net/ipv4/ 目录下。以下是一些关键的源文件及其作用&#xff1a; 1. 协议栈核心 net/ipv4/ip_input.c&#xff1a;处理接收到的 IPv4 数据包&#xff08;输入路径&#xff09;。net…

宝塔平替!轻量级开源 Linux 管理面板 mdserver-web

本文首发于只抄博客&#xff0c;欢迎点击原文链接了解更多内容。 前言 想必很多人刚接触 Linux 云服务器的时候都听过或者用过宝塔面板&#xff0c;对于小白来说&#xff0c;使用面板大大降低了服务器运维的难度&#xff0c;一键安装 LNMP 环境就可以建站了&#xff0c;像是 N…