【Linux进程篇】环境变量

这篇具有很好参考价值的文章主要介绍了【Linux进程篇】环境变量。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

【Linux进程篇】环境变量

作者:爱写代码的刚子
时间:2023.8.13
前言:本篇博客主要介绍操作系统中环境变量有关的知识,了解环境变量有关的指令。

基本概念

  • 环境变量(environment variables)一般是指在操作系统中用来指定操作系统运行环境的一些参数
  • 如:我们在编写C/C++代码的时候,在链接的时候,从来不知道我们的所链接的动态静态库在哪里,但是照样可以链接成功,生成可执行程序,原因就是有相关环境变量帮助编译器进行查找。
  • 环境变量通常具有某些特殊用途,还有在系统当中通常具有全局特性

常见环境变量

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

查看环境变量方法

  • echo $NAME //NAME:你的环境变量名称
    【Linux进程篇】环境变量,Linux,linux,运维,服务器,c++

测试PATH

添加PATH

  • 注意不能写做:PATH=新路径名称,否则之前的PATH将会全部清空
    正确写法:
    【Linux进程篇】环境变量,Linux,linux,运维,服务器,c++
    直接运行test.exe文件:
    【Linux进程篇】环境变量,Linux,linux,运维,服务器,c++

此环境变量是内存级别的,当用户如果不小心改错了重新登陆Xshell即可。(系统文件中已经预存好了环境变量)

测试HOME

用root和普通用户,分别执行 echo $HOME ,对比差异
【Linux进程篇】环境变量,Linux,linux,运维,服务器,c++
【Linux进程篇】环境变量,Linux,linux,运维,服务器,c++

测试SHELL

【Linux进程篇】环境变量,Linux,linux,运维,服务器,c++
保存的是当前shell的可执行程序
. 执行 cd ~ ; pwd,对应~ 和 HOME 的关系

和环境变量相关的命令

  1. echo: 显示某个环境变量值
  2. export: 设置一个新的环境变量
  3. env: 显示所有环境变量
    【Linux进程篇】环境变量,Linux,linux,运维,服务器,c++
  • HISTSIZE Xshell能记录的最大历史指令条数
  • USER当前用户
  • LD_LIBRARY_PATH指定查找共享库(动态链接库)时除了默认路径之外的其他路径。
  • PATH可执行程序的搜索路径
  • LS_COLORS ls的配色方案
  • MAIL是指当前用户的邮件存放目录。
  • PWD当前所处的路径
  • LANG用于定义系统的主语系环境
  • HISTCONTROL可以控制历史的记录方式
  • HOME用户的主目录(也称家目录)
  • SHLVL记录了bash嵌套的层次,一般来说,我们启动第一个Shell时。 $SHLVL=1。如果在这个Shell中执行脚本,脚本中的 $SHLVL=2 。
  • LOGNAME LOGNAME
  • LESSOPEN
  1. unset: 清除环境变量(unset +环境变量名)
  2. set: 显示本地定义的shell变量和环境变量

环境变量的组织方式

【Linux进程篇】环境变量,Linux,linux,运维,服务器,c++
每个程序都会收到一张环境表,环境表是一个字符指针数组,每个指针指向一个以’\0’结尾的环境字符串

通过代码如何获取环境变量

命令行参数

main函数并不是第一个被调用的函数,而是startup函数
编译器如何知道main函数的参数个数?(答:条件编译)
【Linux进程篇】环境变量,Linux,linux,运维,服务器,c++

【Linux进程篇】环境变量,Linux,linux,运维,服务器,c++

  • argc就是argv数组中的元素个数,argv指针数组也叫向量表
  • 输入./test -a -b其实是"./test -a -b",bash会将其分成三个字符串"./test" “-a” “-b”,将这些字符串初始化argv指针*数组
  • 命令行参数可以为指令、工具、软件提供功能选项支持(指令可以带不同的选项和命令行参数有关
    【Linux进程篇】环境变量,Linux,linux,运维,服务器,c++
命令行第三个参数

C/C++代码会有两张核心向量表:(1. 命令行参数表,2. 环境变量表),不要简单理解程序启动就是将进程加载到内存,而是自己的程序在启动时,需要有人调用main函数,将这两张核心向量表传进来
【Linux进程篇】环境变量,Linux,linux,运维,服务器,c++

【Linux进程篇】环境变量,Linux,linux,运维,服务器,c++

  • 我们所运行的进程,都是子进程,bash本身在启动的时候会从操作系统的配置文件中读取环境变量信息,子进程会继承父进程交给我们的环境变量,我们定好的环境变量可以让所有的子进程继承下去,所以环境变量具有全局属性
  • 但是注意!环境变量也是数据,默认情况下是父子共享的,由于进程具有独立性,创建完子进程后,如果想对环境变量进行修改,是不能影响父进程的,因为会写实拷贝

环境变量被继承通常有两种方式:1. 直接继承 2. main函数传参

通过第三方变量environ获取
#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,linux,运维,服务器,c++

libc中定义的全局变量environ指向环境变量表,environ没有包含在任何头文件中,所以在使用时要用extern声明。

程序在编译过程中会链接C库, 所以, extren本身就是说我有一个什么样子的变量, 然后在链接的过程当中在 C库可以找到这个是正常的。

本地变量

  • 直接在命令行定义的变量叫做本地变量:
    【Linux进程篇】环境变量,Linux,linux,运维,服务器,c++
  • set查看本地变量和环境变量
    【Linux进程篇】环境变量,Linux,linux,运维,服务器,c++

【Linux进程篇】环境变量,Linux,linux,运维,服务器,c++

本地变量是不会被子进程继承的

通过系统调用获取或设置环境变量

  • putenv("环境变量=value")

  • getenv("环境变量")
    【Linux进程篇】环境变量,Linux,linux,运维,服务器,c++
    【Linux进程篇】环境变量,Linux,linux,运维,服务器,c++

  • 可以通过比较getenv(“USER”)来判断登陆用户是不是正确的,和权限建立起连接

常用getenv和putenv函数来访问特定的环境变量。

环境变量通常是具有全局属性的

  • 环境变量是系统提供的一组name=value形式的变量,不同的环境变量有不同的用户,通常具有全局属性。
  • 环境变量通常具有全局属性,可以被子进程继承下去

验证子进程会继承父进程的环境变量

  • 导入环境变量:
    【Linux进程篇】环境变量,Linux,linux,运维,服务器,c++
  • 运行test:
    【Linux进程篇】环境变量,Linux,linux,运维,服务器,c++
    子进程是可以继承父进程的环境变量的

验证子进程不会继承父进程的本地变量

【Linux进程篇】环境变量,Linux,linux,运维,服务器,c++
【Linux进程篇】环境变量,Linux,linux,运维,服务器,c++
【Linux进程篇】环境变量,Linux,linux,运维,服务器,c++

【Linux进程篇】环境变量,Linux,linux,运维,服务器,c++
虽然子进程不会继承父进程的本地变量,但是我们可以向子进程中导入父进程的本地变量
【Linux进程篇】环境变量,Linux,linux,运维,服务器,c++

【问题】:echo也是bash的子进程,那为什么echo能拿到并显示父进程的本地变量呢?

【Linux进程篇】环境变量,Linux,linux,运维,服务器,c++
答:命令行上的指令并不一定都需要创建子进程,所以命令分为两种命令:

  • 常规命令——通过子进程创建来完成
  • 内建命令——bash不创建子进程,而是由自己亲自执行,类似于bash调用自己的写的,或者系统提供的函数(cd指令、echo指令)

所以echo是内建命令,自己获取自己的本地变量,不创建子进程

【附】:
chdir函数用于改变当前工作目录。调用参数是指向目录的指针,调用进程需要有搜索整个目录的权限。每个进程都具有一个当前工作目录。在解析相对目录引用时,该目录是搜索路径的开始之处。如果调用进程更改了目录,则它只对该进程有效,而不能影响调用它的那个进程。在退出程序时,shell还会返回开始时的那个工作目录。文章来源地址https://www.toymoban.com/news/detail-648046.html


到了这里,关于【Linux进程篇】环境变量的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 服务器安装 anaconda & conda: command not found [解决方案] & bashrc文件中环境变量配置错误,导致linux命令无法正常使用的解决方案

    由于连接的服务器,无法直接在anaconda官网上下载安装文件,所以使用如下方法: 之后一直按 enter ,直到出现提示要输入 yes or no ,输入 yes 显示以下信息即为安装成功 在终端输入conda info --envs查看anaconda是否安装成功,发现报错:conda: command not found 原因在于: ~/.bashrc文件没

    2024年02月06日
    浏览(95)
  • linux并发服务器 —— 多进程并发(四)

    程序是包含一系列信息的文件,描述了如何在运行时创建一个进程; 进程是正在运行的程序的实例,可以用一个程序来创建多个进程; 用户内存空间包含程序代码以及代码所使用的变量,内核数据结构用于维护进程状态信息; 进程控制块(PCB):维护进程相关的信息,tas

    2024年02月11日
    浏览(55)
  • 【Linux 服务器运维】定时任务 crontab 详解 | 文末送书

    本文思维导图概述的主要内容: 1.1 什么是 crontab Crontab 是一个在 Unix 和 Linux 操作系统上 用于定时执行任务 的工具。它允许用户创建和管理计划任务,以便在特定的时间间隔或时间点自动运行命令或脚本。Crontab 是 cron table 的缩写, cron 指的是 Unix 系统中的一个后台进程,它

    2024年02月08日
    浏览(92)
  • Linux服务器上查询进程 ps aux

    在Linux服务器上查询进程,有以下几种方法: 使用ps命令。这个命令用于报告当前系统的进程状态。可以用以下方式使用ps命令来查看进程信息: ps aux:显示系统中所有进程的信息。 ps -e:显示所有进程的信息。 ps -f:显示进程的所有信息。 ps -l:以长格式显示进程信息。

    2024年02月05日
    浏览(61)
  • 【Linux运维】shell脚本检查服务器内存和CPU利用率

    在管理服务器时候写了一个 shell脚本,在服务上实现每天凌晨3点查系统的指定文件夹下的容量大小,如果超过10G就要删除3天前的内容,还要时刻查询内存和cpu利用率,如果超过80%就要提示用户出现过载 将以上代码保存为一个.sh文件,然后通过crontab在每天凌晨3点运行即可:

    2024年02月09日
    浏览(67)
  • Linux服务器中查看进程的四种方法

    1. 使用 ps aux 命令来查看,能以简单列表的形式显示出进程信息 ps aux 用于报告当前系统的进程状态。可以搭配kill指令随时中断、删除不必要的程序. ps 命令是最基本同时也是非常强大的进程查看命令,使用该命令可以确定有哪些进程正在运行和运行的状态、进程是否结束、进

    2024年02月02日
    浏览(42)
  • Linux网络编程:多进程 多线程_并发服务器

    文章目录: 一:wrap常用函数封装 wrap.h  wrap.c server.c封装实现 client.c封装实现 二:多进程process并发服务器 server.c服务器 实现思路 代码逻辑  client.c客户端 三:多线程thread并发服务器 server.c服务器 实现思路 代码逻辑  client.c客户端 ​​​​   read 函数的返回值 wrap.h  wrap

    2024年02月12日
    浏览(56)
  • Linux服务器常见运维性能测试(1)综合跑分unixbench、superbench

    最近需要测试一批服务器的相关硬件性能,以及在常规环境下的硬件运行稳定情况,需要持续拷机测试稳定性。所以找了一些测试用例。本次测试包括在服务器的高低温下性能记录及压力测试,高低电压下性能记录及压力测试,常规环境下CPU满载稳定运行的功率记录。 这个系

    2024年02月04日
    浏览(82)
  • Linux本地部署1Panel服务器运维管理面板并实现公网访问

    1Panel 是一个现代化、开源的 Linux 服务器运维管理面板。高效管理,通过 Web 端轻松管理 Linux 服务器,包括主机监控、文件管理、数据库管理、容器管理等 下面我们介绍在Linux 本地安装1Panel 并结合cpolar 内网穿透工具实现远程访问1Panel 管理界面 执行如下命令一键安装 1Panel: 安

    2024年02月04日
    浏览(98)
  • 蓝易云:Linux系统sshd命令 – openssh服务器守护进程

    sshd是Linux系统中的一个守护进程,它提供了远程登录服务和安全的文件传输功能。以下是sshd的详细教程。 1. 安装openssh-server 在Debian/Ubuntu上安装openssh-server命令如下: sudo apt-get update sudo apt-get install openssh-server 在CentOS/RHEL上安装openssh-server命令如下: sudo yum update sudo yum install

    2024年02月16日
    浏览(49)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包