【Linux系统编程】—— 深入理解Linux中的环境变量与程序地址空间

ops/2025/1/19 12:48:48/

文章目录

  • 环境变量
  • 常见的环境变量
  • 查看环境变量
  • 环境变量的修改与使用
  • 环境变量的组织⽅式
  • 环境变量的命令
  • 通过代码如何获取环境变量
  • 环境变量的继承

前言:在Linux系统中,环境变量和程序地址空间是系统管理和进程运行的重要组成部分。本文将详细探讨环境变量的作用、如何查看和操作环境变量,并深入了解Linux进程的地址空间及其虚拟内存管理机制。

环境变量

基本概念:
环境变量是操作系统用来指定程序运行环境的参数。它们通常以键值对的形式存储在操作系统中。程序在启动时,系统会将这些环境变量传递给它们。通过环境变量,程序能够获得一些必要的运行信息,如路径、用户名、主目录等。

在开发过程中,我们经常利用环境变量来简化操作。例如,C/C++编译时,如果某些库的路径已被设置为环境变量,编译器就能自动找到它们,而不需要手动指定路径。

常见的环境变量

  • PATH:指定命令的搜索路径。操作系统根据此变量查找可执行文件。
  • HOME:指定用户的主工作目录,即用户登录后默认的目录。
  • SHELL:当前Shell的类型,通常是/bin/bash。

查看环境变量

你可以使用echo命令来查看环境变量的值:

echo $NAME

例如,要查看PATH变量:

echo $PATH

在这里插入图片描述

环境变量的修改与使用

  • 修改PATH:假设你编写了一个C程序并生成了hello可执行文件。通常我们需要带上路径才能执行程序,但你可以通过修改环境变量PATH,使得程序路径自动被查找:
export PATH=$PATH:/path/to/your/program

这样,你就可以直接通过hello命令运行程序,而无需指定完整路径。

  • 设置环境变量:通过export命令设置新的环境变量:
export MYENV="Hello World"

在程序中,你可以使用getenv(“MYENV”)来访问该环境变量。

环境变量的组织⽅式

在这里插入图片描述
每个程序都会收到⼀张环境表,环境表是⼀个字符指针数组,每个指针指向⼀个以’\0’结尾的环境字符串

环境变量的命令

  • echo:显示环境变量的值。
  • export:设置环境变量。
  • env:显示所有环境变量。
  • unset:清除环境变量。
  • set:显示本地定义的Shell变量和环境变量。

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

  • 通过C代码,我们可以访问和修改环境变量。例如,利用getenv函数获取环境变量:
#include <stdio.h>
#include <stdlib.h>int main() 
{printf("%s\n", getenv("PATH"));return 0;
}
//这个程序会打印出当前的PATH变量的值。
  • 命令⾏第三个参数
#include <stdio.h>
int main(int argc, char *argv[], char *env[])
{int i = 0;for(; env[i]; i++){printf("%s\n", env[i]);}return 0;
}
  • 通过第三⽅变量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;
}

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

环境变量的继承

环境变量通常具有全局属性,可以被⼦进程继承下去,子进程会继承父进程的环境变量。因此,当父进程设置环境变量后,子进程可以访问和修改这些变量。

#include <stdio.h>
#include <stdlib.h>
int main()
{char *env = getenv("MYENV");if(env){printf("%s\n", env);}return 0;
}

直接查看,发现没有结果,说明该环境变量根本不存在

  • 导出环境变量

export MYENV=“hello world”
再次运⾏程序,发现结果有了!说明:环境变量是可以被⼦进程继承下去的!


http://www.ppmy.cn/ops/151386.html

相关文章

解决SpringBoot项目启动错误:找不到或无法加载主类

如何解决SpringBoot项目的“找不到或无法加载主类”启动错误 在开发SpringBoot应用时&#xff0c;经常可能会遇到一个启动错误&#xff1a;“错误&#xff1a;找不到或无法加载主类 com.example.controller.demo.DemoApplication”。本文将介绍三种解决这一问题的方法。 方法…

Github仓库与个人介绍界面美化

目录 前言具体操作新建个人仓库添加徽标牌子添加个人信息卡片最终成品代码 前言 下面是一个个人经过美化过后的界面&#xff0c;您仅需根据我下方给出的操作顺序依次执行即可得到一个完美的个人主页&#xff01;&#xff01;&#xff01; 当然&#xff0c;如果你实在不想看冗…

ASP.NET Core中 JWT 实现无感刷新Token

在 Web 应用开发中&#xff0c;用户登录状态的管理至关重要。为了避免用户频繁遇到登录过期的问题&#xff0c;我们可以通过实现 JWT&#xff08;JSON Web Token&#xff09;刷新机制来提升用户体验 推荐: 使用 Refresh Token&#xff08;双 Token 机制&#xff09; 1. 生成和…

【JavaEE进阶】实现简单的加法计算器和用户登录

目录 &#x1f38d;序言 &#x1f333;加法计算器 &#x1f6a9;准备工作 &#x1f6a9;约定前后端交互接口 &#x1f6a9;后端服务器代码的书写 &#x1f334;用户登录 &#x1f6a9;准备工作 &#x1f6a9;约定前后端交互接口 &#x1f3c0;需求分析 &#x1f3c0;…

Redis - 环境搭建

目录 在Ubuntu上安装Redis在Centos上安装RedisCentos7Centos8 版本&#xff1a;使用Redis5系列 操作系统&#xff1a;在Linux中进行安装&#xff08;Redis官方不支持Windows版本&#xff09; 在Ubuntu上安装Redis 更新软件包&#xff1a; sudo apt-get update搜索相关软件包…

清除前端缓存的方式

1.定义 浏览器缓存&#xff08;Browser Caching&#xff09;是为了节约网络的资源加速浏览&#xff0c;浏览器在用户磁盘上对最近请求过的文档进行存储&#xff0c;当访问者再次请求这个页面时&#xff0c;浏览器就可以从本地磁盘显示文档&#xff0c;这样就可以加速页面…

Objective-C语言的数据类型

Objective-C数据类型详解 Objective-C是一种面向对象的编程语言&#xff0c;主要用于macOS和iOS应用程序的开发。作为C语言的超集&#xff0c;Objective-C继承了C语言的基本数据类型&#xff0c;同时也引入了一些独特的特性。本文将对Objective-C的各种数据类型进行详细的介绍…

docker hello world

引言 Docker是一个容器化平台&#xff0c;能够把应用程序及其依赖打包在一个容器中&#xff0c;让容器在任意地方运行。最近刚了解了Docker&#xff0c;自己动手操作了下&#xff0c;做个记录&#xff0c;也希望可以帮助到刚学习Docker的小伙伴。 本文中已使用管理员模式&…