【Linux】环境变量和进程优先级

news2024/11/17 17:22:57

目录

环境变量

什么是环境变量

系统结构

系统接口

深度解析

命令行参数

进程优先级

优先级查看

优先级修改

进程间的概念


环境变量

什么是环境变量

🍮平时在使用 Linux 的时候,总会使用 ls pwd 这类的命令,我们也都知道这些命令也是 语言写的,但是为什么我们自己写的可执行程序需要加上 ./ 才能运行?

🍮这是因为一些在操作系统中用来指定操作系统运行环境的一些参数已经被存储到了环境变量表中

🍮这些特定的人在特定的场景中被使用的变量就叫环境变量

🍮我们可以通过 env 来查看整张环境变量表。

env

🍮其中我们可以看到

PATH : 指定命令的搜索路径
HOME : 指定用户的主工作目录(即用户登陆到Linux系统中时,默认的目录)

USER : 当前用户名

🍮之后可以使用 echo + $ + 环境变量名 ,查看变量的内容。

echo $USER    //这里查看用户名这个环境变量

 

🍮这里的 可以理解成使用指针时的 * ,因为若直接使用 echo 打印,则会输出输入的字符串。

也可以使用 set 查看本地变量和环境变量,且内容相较于环境变量多了许多。

🍮又绕回一开始的问题,我们若想直接用文件名运行程序该怎么办呢?其中的奥秘就在这个 PATH 之中。

🍮看这一串路径是否有些眼熟?我们平时使用的命令就存在这些路径下

🍮PATH 中存的便是指定命令的搜索路径,因此若想直接用文件名运行程序,就需要让操作系统能够找到我们这个程序

🍮现有两种方法能够实现这个操作,其一便是将我们想要直接运行的文件直接拷贝到当前 PATH 的路径下。

🍮其二则是将目标文件所在的路径加入到 PATH 路径下。

🍮我们可以使用 export 定义或修改环境变量。

export 环境变量名=变量中的内容

 🍮像这样我们便定义了一个环境变量,并且能够在环境变量表之中找到。

 🍮有了这个命令那么我们就能够将我们文件的路径加入到 PATH 之中了,但是千万不能直接像这样使用

export PATH=/home/Alpaca/linux-code-library/text.4.18/environ  (文件所在路径)

 

🍮否则便会像如上这样,我们甚至无法找到系统自带的命令,但是确实是能够直接运行自己的程序。

🍮若真的将自己的 PATH 整个改掉的话,不要慌张,重新连接一次服务器即可

🍮实际上需要这样写,就能将我们当前路径追加到 PATH 之中。

export PATH=$PATH:/home/Alpaca/linux-code-library/text.4.18/environ  (文件所在路径)

 🍮如此我们便能够直接使用文件名来运行自己的代码了。

 

系统结构

🍮虽然我们成功将我们当前的路径插入到了环境变量之中,但是只要我们关闭连接,再次打开后便会发现,我们的环境变量又恢复了原样

🍮因为我们的环境变量就存在环境变量表中,所以每次我们添加新的环境变量就相当于往这个表中插入数据

🍮而环境变量表本质就是内存级的一张表,这张表在用户登录系统的时候,系统便会给用户生成一张属于自己的环境变量表

🍮那环境变量所对应的数据都是从哪来的呢?我们可以看看 /etc 路径下的 bashrc 文件,便能观察到一系列环境变量是如何配置的

🍮而系统也正是执行这些特定的配置文件,进而配置当前用户的环境变量表。

🍮正因为每个用户的环境变量都是独有一份,因此可以通过对用户名环境变量的检测来进行权限的限制。不仅如此,环境变量还可以被相关的子进程继承下去

系统接口

🍮系统给我们提供了一个接口 (getenv( )) 供我们访问环境变量。根据 man 手册我们可以知道,我们需要给这个函数一个变量名,之后它便会在环境变量表之中进行查找。找到便返回指向目标内容的指针,反之则返回空指针

🍮我们便很容易写出这样的代码。

#include<iostream>
#include<cstdlib>
#include<unistd.h>
#include<cstdio>

int main()
{

    char* p = getenv("PWD");
    std::cout<<p<<std::endl;
    return 0;
}

 🍮之后我们将程序运行便发现,实际打印出来与 PWD 环境变量的内容一模一样。

🍮本质上调用代码使其运行的就是 bash ,因而二者本身就是父子进程之间的关系bash 的环境变量能在子进程之中存在 ,也恰好证明了环境变量能够被相关子进程继承的这一结论。

🍮不仅如此,还可以直接使用外部环境变量表的指针进行访问

#include<iostream>
#include<cstdlib>
#include<unistd.h>
#include<cstdio>

int main()
{
    extern char** environ;            //声明外部变量
    for(int i = 0;environ[i];i++)     //直到内容为空结束打印
    {
        printf("environ[%d]: %s\n",i,environ[i]);
    }
    return 0;
}

🍮这样便可以打印出一张环境变量表。

深度解析

🍮在 Linux 中不仅有环境变量,还有另一种变量叫做本地变量,定义环境变量时不加  export 定义的便是本地变量。

🍮但本地变量与环境变量不同的地方在于,其无法被子进程继承。因此我们在代码中是无法访问到本地变量的

🍮之后我们不再需要这个变量后可以使用 unset 将其删除。

命令行参数

🍮平时我们都在使用 main 函数,但你知道 main 函数也有参数吗?其实 main 函数中最多能有三个参数。

int main(int argc, char *argv[], char *envp[])
{
    return 0;
}

其中 envp 就是环境变量表, 我们直接打印便能够得到完整的环境变量表。

int main(int argc, char *argv[], char *envp[])
{
    for(int i = 0;envp[i];i++)
    {
        std::cout<<envp[i]<<std::endl;
    }
    return 0;
}

🍮重点在于 argc 和 argv ,不知道各位有没有想过: 为什么我们在使用命令的时候还能够加上选项

🍮在上面我们已经知道,使用命令本质上是运行一个可执行程序。那么后面跟上的选项又该如何理解呢

🍮由于 argv 也是一个指针数组我们不妨用以下代码将 argv 的内容打印出来看看。

int main(int argc, char *argv[], char *envp[])
{
    for(int i = 0;argv[i];i++)
    {
        std::cout<<argv[i]<<std::endl;
    }

    return 0;
}

🍮可以看出,命令的选项以字符串的形式传给了参数,因此有了不同的参数。

🍮因此我们也可以根据运行时所带选项的不同,使程序执行不同的任务

#include <cstdio>
#include <iostream>
#include <cstring>
#include <unistd.h>
#include <cstdlib>

int main(int argc, char *argv[], char *envp[])
{
    if (argc == 1)    //没有参数的情况
    {
        std::cout << "------------------" << std::endl;
        printf("无任务执行,已退出\n");
        std::cout << "------------------" << std::endl;
        exit(0);
    }

    if (argc != 2)    //参数过多的情况
    {
        std::cout << "------------------" << std::endl;
        std::cout << "输入样例不合法" << std::endl;
        std::cout << "------------------" << std::endl;
        exit(2);
    }

    // 判断参数
    if (strcmp(argv[1], "-a") == 0)
    {
        std::cout << "------------" << std::endl;
        std::cout << "执行A任务" << std::endl;
        std::cout << "------------" << std::endl;
    }
    else if (strcmp(argv[1], "-b") == 0)
    {
        std::cout << "------------" << std::endl;
        std::cout << "执行B任务" << std::endl;
        std::cout << "------------" << std::endl;
    }
    else if (strcmp(argv[1], "-c") == 0)
    {
        std::cout << "------------" << std::endl;
        std::cout << "执行C任务" << std::endl;
        std::cout << "------------" << std::endl;
    }
    else
    {
        std::cout << "无目标指令" << std::endl;
    }
    return 0;
}

🍮根据传入参数的不同,从而进行不同的任务。

进程优先级

🍮我们在以前学习过权限的相关内容,而权限与优先级的本质区别在于:

  • 权限决定的是能或不能
  • 优先级则是已经能,决定谁先谁后

🍮为什么有优先级?

cpu 资源有限,当资源不足时根据优先级进行分配,保证先执行最重要的程序

优先级查看

🍮通过 ps -l 我们可以查看进程的优先级。

ps -l

🍮其中 UID 代表的是用户,系统通过 UID 识别用户,但有一个专属的字符串与 UID 对应,供用户使用。

🍮而表示优先级的是 PRI PRI 越小进程优先级别就越高。

🍮NI 为修正数据,范围为[-20,19],一般来说不直接更改 PRI 而是通过修改 NI 从而达到修改优先级的效果。

优先级修改

  • 使用 top 进入任务管理器
  • 输入 r 进入 renice 模式
  • 输入要更改 NI 值进程的 PID
  • 输入更改的 NI 

  

🍮如此便完成了修改。NI 的修改值如果超出了范围,则会修改成范围最贴近的那个值。

🍮值得注意的一点是:PRI(new) = PRI(old)+NI

🍮其中的 PRI(old) ,每次都为 80 ,即更改 NI 时刻关系着 PRI 的大小

进程间的概念

  • 竞争性: 系统进程数目多,而 CPU 资源少,进程之间具有竞争属性。为了高效完成任务,更合理竞争相关资源,便有了优先级
  • 独立性: 多进程运行,运行期间互不干扰
  • 并行: 多个进程在多个 CPU 下分别同时运行。
  • 并发: 多个进程在一个 CPU 下采用进程切换的方式,在一段时间之内,使多个进程都得以推进
     

🍮好了,今天环境变量和进程优先级的讲解到这里就结束了,如果这篇文章对你有用的话还请留下你的三连加关注。 

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

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

相关文章

C语言从入门到精通第14天(C语言预处理)

C语言预处理 预处理概述宏定义条件编译 预处理概述 在前面我们已经对C语言的基础语法知识有所了解了&#xff0c;每次进行程序的编写之前&#xff0c;我们会使用#include命令去导入我们的库函数&#xff0c;而这种以#号开头的命令称为预处理命令。 C语言提供了多种预处理功能…

MATLAB离散时间信号的实现和时域基本运算(九)

1、实验目的&#xff1a; 1&#xff09;了解时域离散信号的特点&#xff1b; 2&#xff09;掌握MATLAB在时域内产生常用离散时间信号的方法&#xff1b; 3&#xff09;熟悉离散时间信号的时域基本运算&#xff1b; 4&#xff09;掌握离散时间信号的绘图命令。 2、实验内容&…

开放原子训练营(第三季)RT-Thread Nano学习营一探究竟

前言 不知道从什么时候起&#xff0c;智能设备开始普及到了我们日常生活的方方面面。下班还未到家&#xff0c;热水器就可以调到合适的温度&#xff1b;上班刚进公司&#xff0c;忘关空调也不再是什么烦恼&#xff1b;诸如夜晚的灯光变换&#xff0c;白昼的窗帘适应等更给我们…

eBPF的发展演进---从石器时代到成为神(二)

3. 发展溯源 回顾技术的发展过程&#xff0c;就像观看非洲大草原日出日落一样&#xff0c;宏大的过程让人感动&#xff0c;细节部分引人深思。每天循环不辍&#xff0c;却又每天不同。 BPF的应用早已超越了它最初的设计&#xff0c;但如果要追溯BPF最初的来源&#xff0c;则必…

nginx(七十一)root、alias、index、try_files关系指令再探

一 root、alias、index、try_files辨析 说明&#xff1a; 这个系列很适合前端人员进阶学习 ① 前言回顾 try_files基础知识 配置try_files实现内容重定向 root和alias指令辨析 ​强调&#xff1a; 1) index只能处理以/结尾的请求2) ​index指令有点在location中判断请…

chatGPT账号apikey码-chatGPT 免费APIKEY

ChatGPT API Key免费吗 ChatGPT使用的API密钥可以免费获取&#xff0c;但是其使用可能会受到一些限制。具体而言&#xff0c;根据你所使用的API提供者和服务级别&#xff0c;免费的API密钥可能会受到以下限制&#xff1a; 次数限制&#xff1a;某些API可能会限制您的API调用次…

Centos 磁盘根目录扩容

Centos磁盘根目录扩容 1.扩容前检查 命令: df -Th or df -h 我们要扩张磁盘空间的就是挂载点为:/ (的这个) 2.添加sda磁盘空间查询磁盘 命令&#xff1a; fdisk -l 其实&#xff0c;我们可以将sda的磁盘新增空间分配给处于sda的 / 挂载目录 也可以跨磁盘将sdb(新磁盘…

约瑟夫环的三种解法(循环链表、数组和用数组模拟链表)

目录 前言 一、用循环链表实现 二、用数组实现 三、用数组模拟链表实现 前言 题目描述&#xff1a; 编号为 1 到 n 的 n 个人围成一圈。从编号为 1 的人开始报数&#xff0c;报到 m 的人离开。 下一个人继续从 1 开始报数。 n-1 轮结束以后&#xff0c;只剩下一个人&am…

dockerfile传参问题和权限问题

dockerfile传参问题和权限问题 一、docker传参 在工作中&#xff0c;使用dockerfile构建镜像的时候&#xff0c;随着业务越来越多&#xff0c;流水线也越来越多&#xff0c;这时候就需要构建一些通用流水线&#xff0c;而通用流水线最大的问题&#xff0c;就是需要传递参数&a…

Linux基础命令和程序部署

Linux基础命令 ls 可以查看当前目录内容ls 后面跟上一个具体路径可以查看指定目录内容ls -l 可以以列表的形式查看&#xff0c;缩写llpwd 查看当前目录的绝对路径cd 切换目录&#xff08;就是window界面的鼠标双击目录进入动作&#xff09;&#xff0c;cd在切换目录时后面可以…

【教学类-34-05】拼图(彩色图片+圆角凹凸拼图)3*4格子(中班主题《个别化拼图》偏美术)

图片展示&#xff1a; 背景需求&#xff1a; 最近班级孩子得了传染病&#xff0c;来了2位孩子。 我觉得&#xff1a;人少的话&#xff0c;孩子们就有充足的时间去拼那些带有凹凸槽的自制彩色图形拼图。 难点&#xff1a; 1、从直线剪切&#xff08;方形拼图&#xff09;转…

Flink Join操作

目录 DataStream API&#xff08;函数编程&#xff09; window Join join coGroup interval Join Table API&#xff08;flink sql) Reguler Join (常规join) inner join left join / right join full join interval join lookup join Window Join INNER/LEFT/RIG…

摄像头录像软件哪款好用?这款就很不错

案例&#xff1a;录屏时怎么录电脑摄像头&#xff1f; 【很多时候我不仅仅需要录制电脑屏幕&#xff0c;还需要在录屏时录入人像&#xff0c;可是我的录屏软件不支持录制人脸。有没有好用的电脑录屏带人脸的屏幕录制工具介绍&#xff1f;】 无论是教学、游戏直播、软件开发、…

HTML + CSS + JS 利用邮编查询 API 实现邮编查询工具

引言 邮政编码是地址信息的重要组成部分&#xff0c;可以帮助快递公司、物流公司等对地址进行快速、准确的识别和派送。因此&#xff0c;邮编查询工具应用在许多业务场景中都有广泛的应用&#xff0c;例如&#xff1a;电商平台、物流公司、金融机构等。通过使用邮编查询 API&a…

fiddler在请求头添加指定信息

下图所示&#xff0c;设置完请求头信息后&#xff0c;点击右上角Actions按钮的Run Filterset now保存信息&#xff0c;即可。

centos7部署FastDFS服务

一、安装需要的相关依赖 yum -y install make cmake gcc gcc-c 因为我的服务器已经安装了gcc&#xff0c;所以略去 使用gcc -v查看版本 yum -y install zip unzip 安装性能事件通知库 yum -y install libevent 安装nginx依赖 yum -y install libevent yum -y install zli…

MITA触摸屏维修WP4053米塔工控机控制屏维修

MITA-TEKNIK米塔触摸屏维修工控机工控屏控制器维修DISPLAY 2COM全系列型号 Mita-Teknik触摸屏维修常见故障&#xff1a;上电无显示&#xff0c;运行报故障&#xff0c;无法与电脑通讯&#xff0c;触摸无反应&#xff0c;触控板破裂&#xff0c;触摸玻璃&#xff0c;上电黑屏&a…

自动化工具 接口自动化测试引擎

一、前言&#xff1a; 1、解决痛点&#xff1a;接口自动化测试用例需要人去开发、去维护。 2、实现第一性原理&#xff1a;根据定义的测试策略自动生成接口测试用例。 二、引擎优势&#xff1a; 1、提升人效&#xff1a;降低传统方式中接口测试开发与维护的工作量。 2、覆盖更…

输电线路在线监拍设备的国网协议对接方案

疫情过后&#xff0c;尤其山东淄博电力建设的发展&#xff0c;电网规模的不断研发&#xff0c;高压远距离架空输电线路日益增多&#xff0c;在复杂地形条件下的电网建设和设备维护工作也越来越多。 如何解决4G模块控制的功耗&#xff0c;和信号传输方面有一套完整的方案。基于合…

【网络安全】红队基础免杀

引言 本文主要介绍“反射型 dll 注入”及“柔性加载”技术。 反射型 dll 注入 为什么需要反射型 dll 注入 常规的 dll 注入代码如下&#xff1a; int main(int argc, char *argv[]) {HANDLE processHandle;PVOID remoteBuffer;wchar_t dllPath[] TEXT("C:\\experime…