Linux 底层核心精讲:环境变量、命令行参数与程序地址空间
环境变量是程序运行的'隐形配置',程序地址空间则是进程访问内存的'底层规则'。理解这两者,不仅能解释'为什么命令能直接运行'、'进程如何安全访问内存'等核心问题,更能为编写灵活的命令行工具、排查内存相关问题提供底层支撑。
本文从环境变量的概念、常用指令与系统调用入手,逐步延伸到 main 函数的命令行参数用法、常规命令与内建命令的区别,最终深入程序地址空间的布局、虚拟地址与物理地址的映射原理(含页表、写时拷贝等核心机制)。每个知识点都配套具体指令示例,文末还附上高频习题及解析,帮助读者夯实基础。
环境变量
环境变量一般指在操作系统中用来指定运行环境的一些参数。不同的环境变量有不同的用途,通常具有全局属性——这里的全局属性意味着它们可以被子进程继承。
Bash 本身在启动的时候,会从操作系统的配置文件中读取环境变量信息。每次启动,环境变量都会被重置;父进程的环境变量变了,子进程会跟着变。
常见的环境变量
- PATH:指定命令的搜索路径。
- HOME:指定用户的主工作目录。
- SHELL:当前 Shell,其值通常是
/bin/bash。 - HISTSIZE:
history能保存之前使用指令的最大条数。 - SSH_TTY:终端设备的路径(SSH 远程登录的话会有)。
- USER 和 LOGNAME:代表当前登录的用户是谁(这俩没啥区别)。
- PWD:表示当前的路径(修改这个不会改变现在在哪个路径哈)。
- OLDPWD:通过
cd命令切换目录时,标记上一次的路径。
和环境变量相关的指令
- echo:显示某个环境变量值。
- export:设置一个新的环境变量。
- env:显示所有环境变量(想只看一个的话就配合
grep过滤)。 - unset:清除环境变量。
- set:显示所有本地变量和环境变量。
修改环境变量示例:
PATH=$PATH:/home/renshen
引申一下:本地变量只在当前 Bash 进程里有效。将本地变量转变成环境变量只需执行 export 变量名(不用加=值)。
通过系统调用获取或设置环境变量
系统调用包括 getenv 和 putenv。
另外,chdir 这个系统调用可以改路径。
main 函数的命令行参数
其实 main 函数原型是 int main(int argc, char *argv[], char *env[])。
第一个参数是接受到的命令行参数的总个数(包括程序名)。
第二个参数是命令行参数(最后一个位置会放一个 NULL),命令行的指令当字符串传过来的。
第三个参数是环境变量数组。
在进程进行时,都会被传入两张核心向量表——命令行参数表和环境变量表。所以,不要 char *env[] 也行,直接在代码里 extern char **environ。env 怎么用,这个也怎么用,例如 environ[0]。这个全局变量指向环境变量表(不用头文件)。
main 函数这样设置的目的,是为指令、工具、软件等提供命令行选项的支持。




