linux进程(环境变量)

news2024/11/17 22:23:52

目录

正文:

常见环境变量

 和环境变量相关的的命令

 通过代码获取环境变量

主函数参数

三个参数 

参数调用

进程优先级

查看系统进程 

PRI和NI

优先级修改 



前言:

环境变量 (environment variables) 一般是指在操作系统中用来指定操作系统运行环境的一些参数
如:我们在编写 C/C++代码的时候,在链接的时候,从来不知道我们的所链接的动态静态库在哪里,但 是照样可以链接成功,生成可执行程序,原因就是有相关环境变量帮助编译器进行查找。
环境变量通常具有某些特殊用途,还有在系统当中通常具有全局特性。
python 也是需要配置编码环境;而在我们的  Linux 中也有 环境变量,由  环境变量 构成的集合称做  环境变量表;我们还可以调整  进程 的优先级,使得  进程 运行更加灵活

通过上图我们可以发现环境变量其实是一组 K:V形式的变量。 

正文:

常见环境变量

  • PATH : 指定命令的搜索路径
  • HOME : 指定用户的主工作目录(即用户登陆到Linux系统中时,默认的目录)
  • SHELL : 当前Shell,它的值通常是/bin/bash

我们可以通过  echo $NAME//NAME是环境变量名字 来查看环境变量

echo $ PATH

 和环境变量相关的的命令

 

1. echo : 显示某个环境变量值
2. export : 设置一个新的环境变量
3. env : 显示所有环境变量
4. unset : 清除环境变量
5. set : 显示本地定义的 shell 变量和环境变量

 

 我们可以思考一下为什么我们写的程序编译完成后,我们需要执行./可执行文件 才可以将程序运行起来呢?但是我们平时使用的不需要加一个./呢?这是因为PATH 环境变量中有存储各种指令(程序)的路径,当我们直接输入指令时,OS会根据 PATH 提供的路径搜索程序,找到了就会直接运行对应指令(程序);而我们自己编写的程序则是需要通过 ./可执行程序 的方式运行,因为此时路径不被包含在 PATH 变量中。

        如果我们想去掉./我们就要把我们的可执行程序的路径加入到系统的路径PATH变量中。

这就要用到export命令 

//不能写成 export PATH=路径 这样会把path路径全部覆盖,我们要的是追加
export PATH=$PATH:/home/cmx-108/lesson8

这样我们就可以像命令行一样将我们的可执行程序直接运行起来。 需要注意的是作为普通用户,手动添加的环境变量只有本次登录才有效,下次登录环境变量会被重置(root用户除外)

除了使用export命令我们还可以将我们程序直接写在user/bin/目录下 也可以直接运行。

 

 我们通过指令env看一下环境变量表

         这里需要加入一个知识,main函数虽然是主函数的入口,但是第一个调用函数并不是main函数而是startup,而且这里会有条件编译如果我们传参 会有传参接收不传参就相应的有不传参接收。

        我们在命令行创建的进程都是bash的子进程,我们都知道创建子进程的时候会继承父进程pcb,当执行不同模块发生写时拷贝,所以也会继承系统的环境变量表,这就是为什么环境变量具有全局属性就是因为继承了bash的环境变量表 在需要的时候可以添加需要的环境变量。

        环境变量表是以指针数组的形式存储的

 也可以通过 set 指令查看 环境变量表,不过 set 指令显示的内容比 env 多得多,因为 set 还会显示 本地环境变量 信息。

 通过代码获取环境变量

 

  • 通过全局变量 environ (char** 类型)获取
  • 通过函数 getenv(NAME) 获取,这个比较常用
  • 通过 main 函数中的第三个参数 char* envp[] 获取

 我们通过下面程序将 第三方变量environ 和系统调用接口getenv查看环境变量进行演示(需要注意的是我们使用的系统调用接口getenv需要包含头文件<stdlib.h>)

#include<iostream>
#include<stdlib.h>  //getenv 需要使用这个头文件
using namespace std;

extern char** environ; //声明使用

int main()
{
  //cout << "Hello environment variable!" << endl;  //你好环境变量!
  int pos = 0;
  while(pos < 5)
  {
    cout << environ[pos] << endl; //获取部分环境变量信息
    pos++;
  }

  cout << endl << "========================" << endl << endl;

  //通过函数获取
  cout << "PWD=" << getenv("PWD") << endl;

  return 0;
}

 下面我们详细介绍一下主函数的参数

主函数参数

三个参数 

 

  • int argc 传入程序中的元素数,./程序名 算一个
  • char* argv[] 传入程序中的元素表,由 bash 制作,传给 main 函数
  • char* envp[] 环境变量表,所谓全局性就是指 main 函数可以通过此参数获取到环境变量表的信息

我们除了环境变量表还要了解第二张核心向量表 叫命令行参数表,可以根据bash传入的选项然后形成字符串,然后将字符串按照空格解析成一个个命令 放入明亮行参数表,尾缀一个NULL(都是有bash完成)。

 我们通过程序证明上面的解析,

#include<iostream>
using namespace std;

int main(int argc, char* argv[], char* envp[])
{
  cout << "现在传入的有效元素数为:" << argc << endl;
  cout << "==========================" << endl;
  cout << "通过元素表打元素信息" << endl;
  int pos = 0;
  while(pos < argc)
  {
    cout << argv[pos] << endl;
    pos++;
  }
  cout << "==========================" << endl;
  cout << "使用环境变量表获取前五个环境变量信息" << endl;
  pos = 0;
  while(pos < 5)
  {
    cout << envp[pos] << endl;
    pos++;
  }
  
  return 0;
}

参数调用

我们思考一下为什么要这么做呢?我们其实从输入的指令也能明白,这是为指令、工具软件提供选项的支持,来执行不同操作完成不同指令任务。

我们可以通过代码演示一下

#include<iostream>
#include<string.h>
#include<stdlib.h>
using namespace std;

//打印提示信息
void Usage(const char* str)
{
  cout << str << " -[a | b | c]" << endl;
}

int main(int argc, char* argv[], char* envp[])
{
  //首先进行身份检验
  if(strcmp(getenv("USER"), "Yohifo") != 0)
  {
    cout << "当前用户为:" << getenv("USER") << endl;
    cout << "非法使用他人程序,操作被拒绝!" << endl;
    return 0;
  }

  //确保选项只有一个
  if(argc != 2)
  {
    cout << "指令错误,尝试重新输入" << endl;
    Usage(argv[0]);
    return 0;
  }

  //验证成功后,进行选项分流
  if(strcmp(argv[1], "-a") == 0)
  {
    cout << "执行 a 任务" << endl;
    cout << "…………………………" << endl;
    cout << "任务执行完成" << endl; 
  }
  else if(strcmp(argv[1], "-b") == 0)
  {
    cout << "执行 b 任务" << endl;
    cout << "…………………………" << endl;
    cout << "任务执行完成" << endl; 
  }
  else if(strcmp(argv[1], "-c") == 0)
  {
    cout << "执行 c 任务" << endl;
    cout << "…………………………" << endl;
    cout << "任务执行完成" << endl;     
  }
  else
  {
    cout << "指令错误,尝试重新输入" << endl;
    Usage(argv[1]);
    return 0;
  }

  return 0;
}

通过不同的选项,调用不同的功能,这就是 main 函数参数存在的意义

选项会同程序名一起,构成一张表,传给 char* argv[] 参数

 

进程优先级

 

cpu 资源分配的先后顺序,就是指进程的优先权( priority )。
优先权高的进程有优先执行权利。配置进程优先权对多任务环境的 linux 很有用,可以改善系统性能。
还可以把进程运行到指定的 CPU 上,这样一来,把不重要的进程安排到某个 CPU,可以大大改善系统整 体性能

查看系统进程 

 

在 进程 的PCB信息中,还包含了这些信息:

  • UID 身份标识
  • PRI 进程优先级,默认为 80
  • NI 进程修正值,这个只有 Linux 中有,配合修改优先级,范围为 [-20, 19]

 我们可以通过ps指令查看系统进程,从而获取优先级相关信息

//注:其中的 myfile 是可执行程序名
$ ps -al | head -1 && ps -al | grep myfile	//查看进程优先级信息

PRI和NI

PRI 也还是比较好理解的,即进程的优先级,或者通俗点说就是程序被 CPU 执行的先后顺序,此值越小
进程的优先级别越高
NI ? 就是我们所要说的 nice 值了,其表示进程可被执行的优先级的修正数值
PRI 值越小越快被执行,那么加入 nice 值后,将会使得 PRI 变为: PRI(new)=PRI(old)+nice
这样,当 nice 值为负值的时候,那么该程序将会优先级值将变小,即其优先级会变高,则其越快被执行
所以,调整进程优先级,在 Linux 下,就是调整进程 nice
nice 其取值范围是 -20至19,一共40个级别

 

优先级修改 

修改步骤

  • 输入 top 指令进入任务管理器
  • 输入 r 进入修改模式
  • 再根据想要修改的进程,输入 PID
  • 最后输入 NI 值,完成修改

虽然进程优先级可以被修改,我们只需要知道这个操作就可以,一般很少回去修改进程优先级。 

 

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

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

相关文章

第68讲表单验证实现

表单验证实现 Form 组件允许你验证用户的输入是否符合规范&#xff0c;来帮助你找到和纠正错误。 Form 组件提供了表单验证的功能&#xff0c;只需为 rules 属性传入约定的验证规则&#xff0c;并将 form-Item 的 prop 属性设置为需要验证的特殊键值即可。 const rulesref({u…

掌握Pandas数据筛选方法与高级应用全解析【第70篇—python:数据筛选】

文章目录 掌握Pandas&#xff1a;数据筛选方法与高级应用全解析1. between方法2. isin方法3. loc方法4. iloc方法5. 查询复杂条件的结合应用6. 避免inplace参数7. 利用Lambda函数进行自定义筛选8. 处理缺失值9. 多条件排序10. 数据统计与分组 总结&#xff1a; 掌握Pandas&…

NLP_引入注意力机制

文章目录 点积注意力创建两个张量x1和x2计算张量点积&#xff0c; 得到原始权重对原始权重进行归一化求出注意力分布的加权和 缩放点积注意力编码器-解码器注意力定义Attention类重构Decoder类重构Seq2Seq类可视化注意力权重 注意力机制中的 Q、K、V自注意力多头自注意力注意力…

Excel——重复项处理

一、高亮重复项 选择需要高亮重复项的列/单元格 选择【数据】——【重复项】—— 【高亮重复项】 如果高亮重复项的数据较长&#xff0c;例如&#xff1a;身份证号、银行卡&#xff0c;可以勾选下列选项&#xff0c;能够精准检查重复项。 结果如下所示 如果想要清除高亮的重复…

Java并发基础:ArrayBlockingQueue全面解析!

内容摘要 ArrayBlockingQueue类是一个高效、线程安全的队列实现&#xff0c;它基于数组&#xff0c;提供了快速的元素访问&#xff0c;并支持多线程间的同步操作&#xff0c;作为有界队列&#xff0c;它能有效防止内存溢出&#xff0c;并通过阻塞机制平衡生产者和消费者的速度…

【Qt 学习之路】在 Qt 使用 ZeroMQ

文章目录 1、概述2、ZeroMQ介绍2.1、ZeroMQ 是什么2.2、ZeroMQ 主线程与I/O线程2.3、ZeroMQ 4种模型2.4、ZeroMQ 相关地址 3、Qt 使用 ZeroMQ3.1、下载 ZeroMQ3.2、添加 ZeroMQ 库3.3、使用 ZeroMQ3.4、相关 ZeroMQ 案例 1、概述 今天是大年初一&#xff0c;先给大家拜个年&am…

c++2024寒假J312实战班2.4

长话短说&#xff0c;简明扼要一直是我的行事风格&#xff0c;如有不精准的地方&#xff0c;就到网上去搜&#xff0c;好吧。 今天分享我们做的四道题&#xff0c;都挺简单的&#xff0c;就是难思考。 题目列表&#xff1a; 1.Maximum Subarray Sum 2.分解因数 3.公交换乘 4.…

05-Java原型模式 ( Prototype Pattern )

原型模式 摘要实现范例 原型模式&#xff08;Prototype Pattern&#xff09;是用于创建重复的对象&#xff0c;同时又能保证性能原型模式实现了一个原型接口&#xff0c;该接口用于创建当前对象的克隆当直接创建对象的代价比较大时&#xff0c;则采用这种模式 例如&#xff0c…

用bootstrap结合jQuery实现简单的模态对话框

嗨害嗨&#xff0c;我又来了奥。今天呢&#xff0c;给大家分享一个工作中常用到的插件——模态对话框的用法。想必大家在工作中也遇到很多页面&#xff0c;需要用模态对话框进行交互的吧&#xff0c;现在呢&#xff0c;就让我们一起来了解一下它的使用吧。 首先&#xff0c;我…

《动手学深度学习(PyTorch版)》笔记8.3

注&#xff1a;书中对代码的讲解并不详细&#xff0c;本文对很多细节做了详细注释。另外&#xff0c;书上的源代码是在Jupyter Notebook上运行的&#xff0c;较为分散&#xff0c;本文将代码集中起来&#xff0c;并加以完善&#xff0c;全部用vscode在python 3.9.18下测试通过&…

【RabbitMQ(二)】:Exchange 详解 | Message Convert 消息转换器

文章目录 03. 使用 Java 代码去操控 RabbitMQ3.1 快速入门3.1.1 创建父子项目3.1.2 编写代码 3.2 Work 模型3.3 RabbitMQ 中的三类交换机3.3.1 Fanout 扇出交换机3.3.2 Direct 交换机3.3.3 Topic 交换机 3.4 声明队列交换机3.4.1 方式一&#xff1a;书写 Config 类3.4.2 方式二…

MySQL篇之回表查询

一、聚集索引 将数据存储与索引放到了一块&#xff0c;索引结构的叶子节点保存了行数据。特点&#xff1a;必须有,而且只有一个。 聚集索引选取规则: 1. 如果存在主键&#xff0c;主键索引就是聚集索引。 2. 如果不存在主键&#xff0c;将使用第一个唯一&#xff08;UNIQUE&am…

算法学习——LeetCode力扣栈与队列篇2

算法学习——LeetCode力扣栈与队列篇2 150. 逆波兰表达式求值 150. 逆波兰表达式求值 - 力扣&#xff08;LeetCode&#xff09; 描述 给你一个字符串数组 tokens &#xff0c;表示一个根据 逆波兰表示法 表示的算术表达式。 请你计算该表达式。返回一个表示表达式值的整数。…

ClickHouse--01--简介

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 1. ClickHouse 简介官网&#xff1a; [https://clickhouse.com/docs/zh](https://clickhouse.com/docs/zh) 1.1 大数据处理场景1.2 什么是 ClickHouse1.3 OLAP 场景…

Tuxera NTFS2024永久免费版磁盘读写软件

Tuxera NTFS 2024由Tuxera公司开发&#xff0c;是一款专为Mac系统设计的NTFS磁盘读写软件。以下是这款软件的具体优势&#xff1a; 全面的读写功能&#xff1a;Tuxera NTFS 2024允许Mac用户全面读写NTFS格式的硬盘、U盘、SD卡等存储设备。这意味着用户可以在Mac上自由读取和写…

Android Graphics 图像显示系统 - 开篇

“ 随着学习的不断深入和工作经验的积累&#xff0c;欲将之前在博客中整理的Android Graphics知识做进一步整理&#xff0c;并纠正一些理解上的错误&#xff0c;故开设Graphics主题系列文章 ” 序言 由于工作需要&#xff0c;也源于个人兴趣&#xff0c;终于下决心花时间整理一…

gem5学习(19):gem5内存系统——The gem5 Memory System

目录 一、Model Hierarchy 二、CPU 三、Data Cache Object 四、Tags & Data Block 五、MSHR and Write Buffer Queues 六、Memory Access Ordering 七、Coherent Bus Object 八、Simple Memory Object 九、Message Flow 1、Memory Access Ordering&#xff08;re…

[每周一更]-(第86期):PostgreSQL入门学习和对比MySQL

入门学习PostgreSQL可以遵循以下步骤&#xff1a; 安装 PostgreSQL&#xff1a; 首先&#xff0c;你需要在你的计算机上安装 PostgreSQL。你可以从 PostgreSQL 官方网站 下载适合你操作系统的安装包&#xff0c;并按照官方文档的指导进行安装。 学习 SQL&#xff1a; PostgreS…

【JS逆向三】逆向某某网站的sign参数,并模拟生成仅供学习

逆向日期&#xff1a;2024.02.06 使用工具&#xff1a;Node.js 类型&#xff1a;webpack 文章全程已做去敏处理&#xff01;&#xff01;&#xff01; 【需要做的可联系我】 可使用AES进行解密处理&#xff08;直接解密即可&#xff09;&#xff1a;AES加解密工具 1、打开某某…

深入理解Go的垃圾回收机制

导语 如果你是一位Golang的开发者&#xff0c;你一定对于语言特性和详细结构有所了解。但是&#xff0c;你是否曾经停下来深入研究过Golang背后复杂而强大的垃圾回收&#xff08;GC&#xff09;机制&#xff1f;在这篇文章中&#xff0c;我们将具体深入探讨Golang垃圾回收机制…