Linux进程理解【环境变量】

news2024/12/23 14:46:32

Linux进程理解【环境变量】

提到环境变量,大家可能有些陌生,如果编写过Java就知道,编写Java需要提前安装JDK,这个操作就是配置Java的编码环境,在Linux中当然也少不了环境变量,下面我们就一起来看看

文章目录

  • Linux进程理解【环境变量】
  • 1. 环境变量
    • 1.1 环境变量表
    • 1.2 添加环境变量
    • 1.3 获取环境变量
  • 2. main函数参数
    • 2.1 参数功能
    • 2.2 参数列表
  • 3. 进程优先级
    • 3.1 系统进程查看
    • 3.2 优先级修改
  • 4. 进程特性

1. 环境变量

环境变量的概念

  • 环境变量一般是指在操作系统中用来指定操作系统运行环境的一些参数

举个例子:我们在编写C/C++代码的时候,在链接的时候,从来不知道我们的所链接的动态静态库在哪里,但是照样可以链接成功,生成可执行程序,原因就是有相关环境变量帮助编译器进行查找。环境变量通常具有某些特殊用途,并且环境变量在系统当中通常具有全局特性

常见环境变量

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

通过指令echo $环境变量名,来查看指定环境变量信息

echo $环境变量名  //查看指定环境变量

1.1 环境变量表

将很多环境变量聚集到一起管理,就组成了环境变量表

通过指令env,来查看本用户对应的环境变量表

env  //查看本用户环境变量表

XDG_SESSION_ID=255667
HOSTNAME=VM-4-2-centos  //机器名
SHELL=/bin/bash  //shell
TERM=xterm
HISTSIZE=3000  //历史命令数量最大值
SSH_CLIENT=111.173.233.59 14786 22
OLDPWD=/home/sakura/Test
SSH_TTY=/dev/pts/0
USER=sakura  //用户
LS_COLORS=rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:mi=01;05;37;41:su=37;41:sg=30;43:ca=30;41:tw=30;42:ow=34;42:st=37;44:ex=01;32:*.tar=01;31:*.tgz=01;31:*.arc=01;31:*.arj=01;31:*.taz=01;31:*.lha=01;31:*.lz4=01;31:*.lzh=01;31:*.lzma=01;31:*.tlz=01;31:*.txz=01;31:*.tzo=01;31:*.t7z=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.dz=01;31:*.gz=01;31:*.lrz=01;31:*.lz=01;31:*.lzo=01;31:*.xz=01;31:*.bz2=01;31:*.bz=01;31:*.tbz=01;31:*.tbz2=01;31:*.tz=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.war=01;31:*.ear=01;31:*.sar=01;31:*.rar=01;31:*.alz=01;31:*.ace=01;31:*.zoo=01;31:*.cpio=01;31:*.7z=01;31:*.rz=01;31:*.cab=01;31:*.jpg=01;35:*.jpeg=01;35:*.gif=01;35:*.bmp=01;35:*.pbm=01;35:*.pgm=01;35:*.ppm=01;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.tiff=01;35:*.png=01;35:*.svg=01;35:*.svgz=01;35:*.mng=01;35:*.pcx=01;35:*.mov=01;35:*.mpg=01;35:*.mpeg=01;35:*.m2v=01;35:*.mkv=01;35:*.webm=01;35:*.ogm=01;35:*.mp4=01;35:*.m4v=01;35:*.mp4v=01;35:*.vob=01;35:*.qt=01;35:*.nuv=01;35:*.wmv=01;35:*.asf=01;35:*.rm=01;35:*.rmvb=01;35:*.flc=01;35:*.avi=01;35:*.fli=01;35:*.flv=01;35:*.gl=01;35:*.dl=01;35:*.xcf=01;35:*.xwd=01;35:*.yuv=01;35:*.cgm=01;35:*.emf=01;35:*.axv=01;35:*.anx=01;35:*.ogv=01;35:*.ogx=01;35:*.aac=01;36:*.au=01;36:*.flac=01;36:*.mid=01;36:*.midi=01;36:*.mka=01;36:*.mp3=01;36:*.mpc=01;36:*.ogg=01;36:*.ra=01;36:*.wav=01;36:*.axa=01;36:*.oga=01;36:*.spx=01;36:*.xspf=01;36:  //配色方案
LD_LIBRARY_PATH=:/root/.VimForCpp/vim/bundle/YCM.so/el7.x86_64:/home/sakura/.VimForCpp/vim/bundle/YCM.so/el7.x86_64
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
MAIL=/var/spool/mail/root
PWD=/home/sakura  //当前文件路径
LANG=en_US.utf8
HOME=/home/sakura  //家目录
SHLVL=2
LOGNAME=sakura  //当前登录用户
SSH_CONNECTION=111.173.233.59 14786 10.0.4.2 22
LESSOPEN=||/usr/bin/lesspipe.sh %s
PROMPT_COMMAND=history -a; history -a; history -a; history -a; printf "\033]0;%s@%s:%s\007" "${USER}" "${HOSTNAME%%.*}" "${PWD/#$HOME/~}"
XDG_RUNTIME_DIR=/run/user/0
HISTTIMEFORMAT=%F %T 
_=/usr/bin/env

还可以通过set指令,查看本地变量和本用户环境变量表,内容很多,并不是很常用

set  //查看本地变量和本用户环境变量表

环境变量表实际上就是一个指针数组,指针指向具体的环境变量内容

这里有一个问题:Linux下,lspwd等指令本质也是可执行程序,和我们自己编写的可执行程序没有什么区别,而我们自己实现的需要带上./才能执行,这是为什么呢?

  • PATH环境变量中,存储着各种指令的路径,Linux中的指令都是C语言编写的,本质都是可执行程序,我们执行指令就相当于运行程序,OS会根据PATH提供的路径,找到对应指令(可执行程序)来直接运行
  • 我们自己编写的程序不被包含到PATH环境变量中,直接执行会找不到,所以需要加上./才能运行

知道了这一点,那么我们如果将自己实现的可执行程序加入到PATH变量中,是否也可以想指令一样使用呢?答案是肯定的!

export PATH=$PATH:绝对路径  //添加路径到PATH变量

直接像指令一样使用是无法运行的,下面我们将路径加入PATH变量中

这样就可以像指令一样运行我们自己编写的程序了

注意:

  • 普通用户修改环境变量列表没什么大问题,本次修改只在本次有效,再次登录时环境列表会被重置
  • root用户尽量不要修改环境变量列表,避免出现意外

我们还可以将程序写到usr/bin目录下,也可以起到以上的效果

我们可以在这个目录下看到熟悉的ls等指令,将程序写到此处,就相当于将应用安装到了系统中,指令在这删除之后也无法再使用了,这也就是Linux下安装和卸载软件的原理

1.2 添加环境变量

通过变量名=内容直接在命令行中添加本地变量,可以设置本地变量,本地变量只能供shell使用,是不被子进程共享的

变量名=内容  //添加本地变量

通过指令unset 本地变量名,可以删除本地变量

unset 本地变量名  //取消本地变量

加上关键字export就可以将变量写入环境变量表,环境变量表具有全局属性,被所有子进程共享

1.3 获取环境变量

程序运行时,环境变量表会传递给程序使用,可以在程序中获取环境变量

  • 使用extern char** environ二级字符指针获取,它是指向envp字符串指针数组的
  • 使用函数char* getenv(char* name)获取
  • 使用main函数的第三个参数char* envp获取

先来看看使用extern char** environ二级字符指针获取

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

extern char** environ; //声明

int main()
{
  for(int i = 0; environ[i]; ++i){
    printf("environ[%d]->%s\n",i ,environ[i]);
  } 
  return 0;
}

当然也可以通过函数char* getenv(char* name)获取,获取成功返回环境变量内容,失败则返回NULL

#include <stdio.h>
#include <stdlib.h>

int main()
{
  char* user = getenv("USER");
  if(user == NULL)
  {
    perror("无此环境变量!\n");
    exit(-1);
  }
  else
  {
    printf("USER=%s\n", user);
  }
  return 0;
}

结合以上内容,我们通过getenv()函数获取环境变量信息,再将程序路径添加到PATH变量中,就可以自己模拟实现指令了

#include <stdio.h>
#include <stdlib.h>

int main()
{
  printf("%s", getenv("PWD"));
  return 0;
}

使用第三种方法获取之前,我们先来讲解一下主函数main的三个参数

2. main函数参数

2.1 参数功能

我们平时使用main函数都是不带参的,其实它是有三个参数的

  • int argc,表示传入程序中的元素个数
  • char argv[],表示传入程序中的元素表,由bash制作*
  • char envp[],表示环境变量表*

argv也是一个字符串指针数组,每个元素对应的一个字符串,字符串以’\0’为结束标志,数组以NULL为标识结束数组的

我们还是通过程序来观察三个参数

#include <stdio.h>
#include <stdlib.h>
  
int main(int argc, char* argv[], char* envp[])                    {
  printf("传入的有效元素个数:%d\n", argc);
 
  printf("元素表元素信息:\n");
  for(int i = 0; i < argc; i++)
  {
    printf("argv[%d]->%s\n", i, argv[i]);
  }
 
  printf("获取环境变量表前七个环境变量的信息:\n");
  for(int i = 0; i < 7; i++)
  {
    printf("envp[%d]->%s\n", i, envp[i]);
  }
  return 0;
}

通过程序运行可以发现

  • ./mytest这个可执行程序也会被传入元素表中
  • 我们也可以自己传入元素到元素表中,这也就是指令后可以跟上参数列表的原理了,类似ls -a -lls就是一个可执行程序,-a-l就是传入参数列表
  • main 函数可以通过envp参数获取到环境变量表的信息,也就是环境变量表可以通过参数传递给程序使用,这就是环境变量表有全局属性,能被共享的本质了

2.2 参数列表

下面我们来看看参数列表的使用,也就是利用 char* argv[] 来实现指定参数完成指定任务

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

//打印提示信息
void Argvment(const char* name)
{
  printf("Argvment: %s [-a|-b|-c]\n", name);
  exit(0);
}

int main(int argc, char* argv[])
{
  if(argc != 2) //确保选项只有一个
  {
    printf("指令错误,请重新输入!\n");
    Argvment(argv[0]);
    return 0;
  }

  if(strcmp(argv[1], "-a") == 0)
  {
    printf("执行任务a!\n");
  }
  else if(strcmp(argv[1], "-b") == 0)
  {
    printf("执行任务b!\n");
  }
  else if(strcmp(argv[1], "-c") == 0)
  {
    printf("执行任务c!\n");
  }
  else
  {
    printf("指令错误,请重新输入!\n");
  }
  return 0;
}

选项和程序一起构成一张元素表,传递给 char* argv[] 参数,通过不同的选项,来调用不同的功能

3. 进程优先级

进程优先级就是指的是进程的优先权,也就是指CPU资源分配的先后顺序!优先权高的进程先执行,优先级低的后执行!这样的目的是为了改善系统性能!

3.1 系统进程查看

进程的PCB信息都有自己的意义

  • UID:执行者身份
  • PID:进程代号
  • PPID:父进程代号
  • PRI:进程优先级,默认为80
  • NI:进程优先级对应的修正值,范围是[-20, 19]

其中PRI的一个求法:PIR(new) = PRI(old) + nice。另外我们的进程会通过CPU来做计算,CPU中有调度器,这个调度器的作用就是来对进程的优先级一碗水端平,不会过度的使得其进程优先级很高,也不会过度的使得其进程优先级很低,所以这里的NI值也不会很高,这样就可以达到一碗水端平的目的。

通过ps指令来查看进程信息

ps -l/ps -al  //查看进程信息

3.2 优先级修改

优先级修改步骤

  • 使用top命令进入任务管理器
  • 输入 r 进入修改模式
  • 输入想要修改的进程的PID
  • 输入NI值完成修改

修改进程优先级的操作不难,而且很少会修改,这里我就不演示了

注意:

  • 修改优先级后,最终优先级=初始优先级+NI值

  • NI值的范围为 [-20, 19],设置时超出部分将会无效

  • 优先级的修改行为并不是连续的,每次修改都是在最开始的基础上进行,进程重新开始后其PRINI都会恢复原值

4. 进程特性

总结一下进程的特性

  • 竞争性:系统进程数目很多,但是CPU资源有限,所以进程之前存在竞争
  • 独立性:多进程运行需要独享资源,互不干扰
  • 并行:多个进程可以在多个CPU下分别同时运行
  • 并发:多个进程在一个CPU下采用进程切换的方式,在一段时间内,让多个进程都得以推进

Linux进程理解—环境变量,到这里就介绍结束了,本篇文章对你由帮助的话,期待大佬们的三连,你们的支持是我最大的动力!

文章有写的不足或是错误的地方,欢迎评论或私信指出,我会在第一时间改正

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

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

相关文章

SpringBoot 统一功能的处理

SpringBoot 统一功能的处理 文章目录 SpringBoot 统一功能的处理1. 用户登录权限校验1.1 最初用户登录验证1.2 Spring AOP 统一用户登录验证的问题1.3 SpringAOP 拦截器1.3.1 实现自定义拦截器1.3.2 将自定义拦截器加入到系统配置 1.4 拦截器实现原理1.4.1 实现流程图1.4.2 实现…

LeetCode:3. 无重复字符的最长子串

&#x1f34e;道阻且长&#xff0c;行则将至。&#x1f353; &#x1f33b;算法&#xff0c;不如说它是一种思考方式&#x1f340; 算法专栏&#xff1a; &#x1f449;&#x1f3fb;123 题解目录 一、&#x1f331;[3. 无重复字符的最长子串](https://leetcode.cn/problems/l…

分享维修一例DELL R540服务器黄灯无法开机故障

DELL PowerEdge R540服务器故障维修案例&#xff1a;&#xff08;看到文章就是缘分&#xff09; 客户名称&#xff1a;东莞市某街道管理中心 故障机型&#xff1a;DELL R540服务器 故障问题&#xff1a;DELL R540服务器无法开机&#xff0c;前面板亮黄灯&#xff0c;工程师通过…

私有GitLab仓库 - 本地搭建GitLab私有代码仓库并随时远程访问

文章目录 前言1. 下载Gitlab2. 安装Gitlab3. 启动Gitlab4. 安装cpolar内网穿透5. 创建隧道配置访问地址6. 固定GitLab访问地址6.1 保留二级子域名6.2 配置二级子域名 7. 测试访问二级子域名 前言 GitLab 是一个用于仓库管理系统的开源项目&#xff0c;使用Git作为代码管理工具…

javaee jstl表达式

jstl是el表达式的扩展 使用jstl需要添加jar包 package com.test.servlet;import java.io.IOException; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map;import javax.servlet.ServletException; import javax.servlet…

【C++】面向对象三大特性之继承

【C】面向对象三大特性之继承 继承的概念继承基类成员访问方式的变化子类到父类对象之间赋值兼容转换继承中的作用域子类的默认成员函数继承和友元、静态成员的关系菱形继承和菱形的虚拟继承虚拟继承解决二义性和数据冗余 继承的概念 继承&#xff1a;是面向对象程序设计使代码…

解析Android VNDK/VSDK Snapshot编译框架

1.背景 背景一&#xff1a; 为解决Android版本碎片化问题&#xff0c;引入Treble架构&#xff0c;它提供了稳定的新SoC供应商接口&#xff0c;引入HAL 接口定义语言&#xff08;HIDL/Stable AIDL&#xff0c;技术栈依然是Binder)&#xff0c;它指定了 vendor HAL 和system fr…

动态规划01背包之416分割等和子集(第10道)

题目&#xff1a; 给你一个 只包含正整数 的 非空 数组 nums 。请你判断是否可以将这个数组分割成两个子集&#xff0c;使得两个子集的元素和相等。 示例&#xff1a; 解法&#xff1a; 先复习一下01背包问题&#xff1a; dp[i][j]的含义&#xff1a;从下标为[0-i]的物品里…

【Spring Boot】Spring Boot的系统配置 — 日志配置

日志配置 日志对于系统监控、故障定位非常重要&#xff0c;比如当生产系统发生问题时&#xff0c;完整清晰的日志记录有助于快速定位问题。接下来介绍Spring Boot对日志的支持。 1.Spring Boot日志简介 Spring Boot自带spring-boot-starter-logging库实现系统日志功能&#…

基于linux下的高并发服务器开发(第一章)- 目录操作函数

09 / 目录操作函数 &#xff08;1&#xff09;int mkdir(const char* pathname,mode_t mode); #include <sys/stat.h> #include <sys/types.h>int mkdir(const char *pathname, mode_t mode); 作用&#xff1a;创建一个目录 参数&#xff1a; pat…

固态硬盘SSD选型测试大纲

一&#xff0c;前言 目前不仅仅是家用电脑系统盘很多都采用了固态硬盘&#xff0c;很多工业产品也选用固态硬盘作为存储介质&#xff0c;这主要得益于固态硬盘相对于机械硬盘的优势。 固态硬盘(Solid State Disk)都是由主控芯片和闪存芯片组成&#xff0c;简单来说就是用固态电…

Python编程从入门到实践_5-10 检查用户名_答案

#《Python编程从入门到实践》&#xff0c;动手试一试&#xff0c;5-10检查用户名&#xff0c;答案。2023-07-15,by qs。 current_users [AaA,bBb,CcC,DdD,EeE] new_users [AAA,bbb,abc,def,hij] for new_user in new_users:current_users_1 []for current_user in current_u…

安达发|汽车零部件行业追溯系统的应用

汽车行业正处于一个蓬勃发展的阶段&#xff0c;随着客户需求的不断变化&#xff0c;生产厂商推出新款商品的速度也越来越快&#xff0c;新项目和变更的不断出现&#xff0c;就可能导致在交付的产品质量方面遇到各种各样的问题。如果这些质量问题得不到及时有效地追溯和控制&…

华为模拟器eNSP过程中所遇问题(40错误)与解决办法

1. 版本 2.打开ensp开启AR2204&#xff0c;报错40 3.弹出文档&#xff0c;挨着试一遍先 安装eNSP的PC上是否存在名为“VirtualBox Host-Only Network”的虚拟网卡 需要启用。虚拟网卡的设置是否符合以下要求&#xff1a;IP地址为192.168.56.1&#xff0c;子网掩码为255.255.2…

Typora设置Gitee图床,自动上传图片

之前写了一篇同类型文章&#xff1a;如何将Typora中图片上传到csdn 实现了Typora本地编辑的内容中的图片&#xff0c;可以直接复制到csdn上进行发布。但是在使用过程中发现sm.ms这个图床站不是很稳定&#xff0c;即使用了翻墙也不稳定。 这篇文章推荐使用Gitee作为图床&#xf…

C++教程(六)——数组

1 数组 1.1 概述 所谓数组&#xff0c;就是一个集合&#xff0c;里面存放了相同类型的数据元素 **特点1&#xff1a;**数组中的每个数据元素都是相同的数据类型 **特点2&#xff1a;**数组是由连续的内存位置组成的 12 一维数组 1.2.1 一维数组定义方式 一维数组定义的三…

FL Studio21编曲软件中文版如何下载更新?

国人习惯称之为水果&#xff0c;也是我个人现在在用的软件。FL Studio是一款比较全面的编曲软件&#xff0c;其通道机架可以使用户添加各种音频采样&#xff0c;快捷编辑节奏型。对于音频的剪辑、拼接、效果处理也非常优秀。非常适合电子音乐编曲以及一些Hiphop。但是其录音、以…

组合数学相关知识总结(目前主要总结了卡特兰数)

全排列 例子&#xff1a; n n n 个数取 m m m 个数有序排放 通项公式&#xff1a; A n m ( P n m ) n ∗ ( n − 1 ) ∗ ( n − 2 ) ∗ ⋅ ⋅ ⋅ ∗ ( n − m 1 ) n ! ( n − m ) ! A_n^m(P_n^m)n*(n-1)*(n-2)**(n-m1) \frac{n!}{(n-m)!} Anm​(Pnm​)n∗(n−1)∗(n−2)∗…

带你【玩转Linux命令】➾ diffstat file 每天2个day05

带你【玩转Linux命令】➾ diffstat & file 每天2个day05 &#x1f53b; 一、文件管理命令1.1 diffstat -根据diff的比较结果&#xff0c;显示统计数字1.2 file-辨识文件类型 &#x1f53b; 总结—温故知新 &#x1f448;【上一篇】 &#x1f496;The Begin&#x1f496; …

几种生成css背景图的方式

几种生成css背景图的方式 使用 CSS 向网页添加背景图案可以为我们的网站增添一些更强烈的个人风格。本文将为介绍几种使用 CSS 生成背景和图案的方式。 Hero Patterns Hero Patterns 是一个免费且易于使用的css背景生成网站&#xff0c;该生成器具有多种来自自然、动物等的图…