Linux 环境变量、命令行参数与地址空间
环境变量、命令行参数和程序地址空间,表面上是三块互不相干的内容,实际都绕着'进程怎么拿到外部信息、怎么安全访问内存'转。前两者决定程序启动时能看到什么,后者决定它到底能怎么用这些内存。
环境变量
环境变量是操作系统给进程准备的一组运行时参数。它们有继承关系:父进程导出的内容,子进程通常也能看到。Shell 启动后会读取一部分系统配置,再把当前环境带到新开的进程里,所以环境变量不是写死的,而是会随着会话变化。
常见的环境变量有这些:
- PATH:命令搜索路径。
- HOME:当前用户主目录。
- SHELL:当前使用的 Shell,通常是
/bin/bash。 - HISTSIZE:
history记录的最大条数。 - SSH_TTY:远程登录时的终端设备路径。
- USER / LOGNAME:当前登录用户。
- PWD:当前目录。
- OLDPWD:上一次目录位置。
和环境变量打交道,最常用的命令也就这些:
- echo:查看变量值。
- export:把本地变量导出成环境变量。
- env:查看当前环境变量。
- unset:删除环境变量。
- set:查看本地变量和环境变量。
比如追加路径:
PATH=$PATH:/home/renshen
这里更容易混淆的是'本地变量'和'环境变量'。本地变量只在当前 Bash 进程里有效,export 之后才会进入环境,子进程才能继承。export 变量名 就够了,不需要再写 =值。
获取和设置环境变量,底层常见的是 getenv、putenv 这类接口;切换当前目录则是 chdir。它们解决的是不同层面的事,别混在一起看。
main 函数的命令行参数
main 的常见原型是:
int main(int argc, char *argv[], char *env[])
更常见的写法是:
int main(int argc, char *argv[])
第一个参数 argc 表示参数个数,包含程序名本身。第二个参数 argv 是参数数组,最后一个元素是 NULL。第三个参数如果写出来,就是环境变量数组。
程序启动时,内核会把命令行参数和环境变量一起交给进程。环境变量也可以不用 env[] 直接拿,Linux 里还能通过 访问到它。 这样的用法和 很像,都是以指针数组的方式组织。




