【Linux探索学习】第十五弹——环境变量:深入解析操作系统中的进程环境变量

Linux学习笔记:

https://blog.csdn.net/2301_80220607/category_12805278.html?spm=1001.2014.3001.5482

前言:

环境变量(Environment Variables)是操作系统与应用程序之间的重要桥梁。它们为进程提供运行时配置信息,在操作系统的资源管理和应用程序的灵活性方面扮演了关键角色。本文将全面介绍进程环境变量的概念、常见环境变量、操作指令,以及如何通过C语言中的getenvsetenv函数对环境变量进行操作,配以代码示例和表格,帮助你深入理解这一重要知识点。


目录

一、环境变量的基础概念

[1.1 什么是环境变量?](#1.1 什么是环境变量?)

[1.2 环境变量的作用](#1.2 环境变量的作用)

二、常见环境变量

示例:查看系统中的环境变量

三、环境变量的特性

[3.1 环境变量的继承](#3.1 环境变量的继承)

示例:父子进程环境变量继承

[3.2 环境变量的生命周期](#3.2 环境变量的生命周期)

四、管理环境变量的常用指令

五、C语言中的环境变量操作

[5.1 获取环境变量:getenv](#5.1 获取环境变量:getenv)

函数原型

示例:获取环境变量值

[5.2 设置环境变量:setenv](#5.2 设置环境变量:setenv)

函数原型

示例:设置环境变量

[5.3 删除环境变量:unsetenv](#5.3 删除环境变量:unsetenv)

函数原型

示例:删除环境变量

[5.4 遍历所有环境变量:environ](#5.4 遍历所有环境变量:environ)

示例:打印所有环境变量

六、环境变量的安全性与常见问题

[6.1 环境变量的安全性](#6.1 环境变量的安全性)

[6.2 常见问题与解决方案](#6.2 常见问题与解决方案)

七、总结


一、环境变量的基础概念

1.1 什么是环境变量?

环境变量是键值对形式的全局变量,定义了系统和进程的运行环境。它们用于存储系统配置、用户信息以及运行时参数,供操作系统和应用程序读取和使用。

环境变量的基本格式为:

cpp 复制代码
KEY=VALUE
  • KEY:变量名(大小写敏感)。
  • VALUE:变量值,可以是路径、字符串、数字等。

1.2 环境变量的作用

环境变量的主要作用包括:

  • 配置程序运行环境:如定义程序搜索路径、语言环境等。
  • 传递系统信息:提供系统版本、主机名等信息。
  • 控制进程行为:通过变量值影响程序的行为和运行逻辑。

我们来讲一下一个常见的环境变量的作用:程序搜索路径(PATH)

PATH时我们在打开系统时就会存在的环境变量,我们可以通过下面的指令查看PATH环境变量的内容:

cpp 复制代码
echo $PATH

我们可以查看到一串的路径,那么这些路径有什么特殊之处吗?

我们可以看这样一个例子,对于我们自己生成的一个可执行文件,比如myproc,要想运行必须是./myporc,而不能是.myproc,原因就是我们执行一个文件时是需要先找到它的位置的,我们需要告诉系统它是在当前路径下的

但是我们也知道有一些指令,比如pwd指令,我们并没有告诉系统它所在的位置,但是它仍然能够被执行,这又是为什么呢?这就与我们上面PATH中的路径有关了

之所以系统指令比如pwd,ls等可以不指明路径的原因就是它们的路径其实就是上面PATH中的路径,这些路径是系统默认搜索路径,而我们自己创建的路径并不包含在其中,但其实我们可以通过操作将我们的路径添加进去,比如:

cpp 复制代码
PATH = $PATH:/home/zwt

此时我们就发现我们将我们自己的路径也添加到PATH中去了

另外我们使用which查找指令时就是从PATH环境变量中搜索的,所以此时我们也可以使用which查找我们自己写的可执行文件,比如上面提到的myproc


二、常见环境变量

以下是操作系统中常见的环境变量及其作用:

环境变量 描述 示例
PATH 定义可执行程序的搜索路径,多个路径用冒号分隔。 /usr/bin:/bin:/usr/local/bin
HOME 当前用户的主目录。 /home/username
USER 当前用户名。 username
SHELL 用户默认的Shell路径。 /bin/bash
LANG 语言和区域设置,影响程序的语言显示。 en_US.UTF-8
LD_LIBRARY_PATH 动态链接库搜索路径。 /usr/local/lib:/usr/lib
TEMPTMP 临时文件的存储路径。 /tmp
EDITOR 默认文本编辑器。 vim

示例:查看系统中的环境变量

cpp 复制代码
# 查看所有环境变量
env

# 打印特定环境变量
echo $PATH

三、环境变量的特性

3.1 环境变量的继承

环境变量在进程的生命周期中由父进程传递给子进程。当一个进程创建子进程时,子进程会继承父进程的环境变量。

  • 父进程修改环境变量,不影响已运行的子进程。
  • 子进程修改环境变量,也不会影响父进程。
示例:父子进程环境变量继承
cpp 复制代码
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

int main() {
    printf("Parent: PATH = %s\n", getenv("PATH"));

    pid_t pid = fork();
    if (pid == 0) {
        // 子进程
        setenv("PATH", "/tmp", 1);
        printf("Child: PATH = %s\n", getenv("PATH"));
    } else {
        // 父进程
        sleep(1);  // 等待子进程修改完成
        printf("Parent after fork: PATH = %s\n", getenv("PATH"));
    }

    return 0;
}

子进程的PATH环境变量修改了,但是父进程的没有被修改

输出说明

  • 子进程的修改不会影响父进程的环境变量。

3.2 环境变量的生命周期

  • 环境变量的生命周期与进程绑定。
  • 进程终止时,其环境变量也会被销毁。

四、管理环境变量的常用指令

在Linux中,可以通过命令行轻松管理环境变量。

指令 描述 示例
echo $VAR 查看环境变量的值。 echo $HOME
export VAR=value 设置环境变量,并导出到子进程。 export MYVAR=123
unset VAR 删除环境变量。 unset MYVAR
envprintenv 查看当前进程的所有环境变量。 env

五、C语言中的环境变量操作

在C语言中,可以通过标准库函数操作环境变量,包括获取、设置和删除。

5.1 获取环境变量:getenv

getenv函数用于获取指定环境变量的值。如果环境变量不存在,则返回NULL

函数原型
cpp 复制代码
char *getenv(const char *name);
示例:获取环境变量值
cpp 复制代码
#include <stdio.h>
#include <stdlib.h>

int main() {
    char *path = getenv("PATH");
    if (path) {
        printf("PATH: %s\n", path);
    } else {
        printf("PATH not set.\n");
    }
    return 0;
}

5.2 设置环境变量:setenv

setenv函数用于设置或更新环境变量的值。

函数原型
cpp 复制代码
int setenv(const char *name, const char *value, int overwrite);
  • name:环境变量名。
  • value:环境变量值。
  • overwrite:是否覆盖已有值(非零值表示覆盖)。
示例:设置环境变量
cpp 复制代码
#include <stdio.h>
#include <stdlib.h>

int main() {
    // 设置环境变量
    if (setenv("MYVAR", "Hello, World!", 1) == 0) {
        printf("MYVAR set to: %s\n", getenv("MYVAR"));
    } else {
        perror("Failed to set environment variable");
    }

    return 0;
}

5.3 删除环境变量:unsetenv

unsetenv函数用于删除指定的环境变量。

函数原型
cpp 复制代码
int unsetenv(const char *name);
示例:删除环境变量
cpp 复制代码
#include <stdio.h>
#include <stdlib.h>

int main() {
    setenv("MYVAR", "Hello, World!", 1);
    printf("Before unset: MYVAR = %s\n", getenv("MYVAR"));

    unsetenv("MYVAR");
    printf("After unset: MYVAR = %s\n", getenv("MYVAR"));  // 输出NULL

    return 0;
}

5.4 遍历所有环境变量:environ

全局变量environ存储了所有环境变量的指针数组,可以用来遍历当前进程的环境变量。

示例:打印所有环境变量
cpp 复制代码
#include <stdio.h>

extern char **environ;

int main() {
    char **env = environ;
    while (*env) {
        printf("%s\n", *env);
        env++;
    }
    return 0;
}

六、环境变量的安全性与常见问题

6.1 环境变量的安全性

环境变量可能存储敏感信息(如API密钥、密码等),因此需要注意以下几点:

  1. 避免敏感信息暴露:尽量不要在环境变量中存储明文密码。
  2. 限制环境变量的访问范围:不要轻易导出变量到子进程。
  3. 验证外部输入:防止外部程序通过环境变量注入恶意代码。

6.2 常见问题与解决方案

问题 原因 解决方案
环境变量未被子进程继承 未使用export导出环境变量。 使用export命令显式导出。
环境变量过长导致错误 部分系统对环境变量大小有限制(如ARG_MAX)。 尽量缩短环境变量的值,或使用文件存储配置信息。
修改环境变量无效 修改变量后未启动新进程。 确保变量在进程启动前已正确设置。

七、总结

环境变量是操作系统与应用程序之间的重要接口,它以简单而灵活的方式为进程提供运行时的配置信息。从本文中,我们学习了环境变量的基本概念、常见变量、管理方式,以及如何使用C语言操作环境变量。通过理论分析和代码示例,希望你能在实际开发中更好地理解和应用环境变量。

在实际学习和工作中,合理使用环境变量能够极大提高程序的可配置性和灵活性,同时也需要注意其安全性,避免泄露敏感信息。


感谢各位大佬观看,创作不易,还请各位大佬点赞支持!!!

相关推荐
Michaelwubo42 分钟前
Docker dockerfile镜像编码 centos7
运维·docker·容器
远游客07131 小时前
centos stream 8下载安装遇到的坑
linux·服务器·centos
马甲是掉不了一点的<.<1 小时前
本地电脑使用命令行上传文件至远程服务器
linux·scp·cmd·远程文件上传
jingyu飞鸟1 小时前
centos-stream9系统安装docker
linux·docker·centos
好像是个likun1 小时前
使用docker拉取镜像很慢或者总是超时的问题
运维·docker·容器
超爱吃士力架1 小时前
邀请逻辑
java·linux·后端
南宫生1 小时前
力扣-图论-17【算法学习day.67】
java·学习·算法·leetcode·图论
sanguine__2 小时前
Web APIs学习 (操作DOM BOM)
学习
数据的世界014 小时前
.NET开发人员学习书籍推荐
学习·.net
cominglately4 小时前
centos单机部署seata
linux·运维·centos