news 2026/5/11 12:33:31

进程(2):环境变量与进程地址空间

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
进程(2):环境变量与进程地址空间

命令行参数

命令行参数是用户在命令行界面执行可执行程序 / 系统命令时,紧跟在程序名之后输入的字符串序列。

C语言程序想要接收命令行参数,必须使用 main 函数的完整标准原型:

intmain(intargc,char*argv[])
参数名全称含义
argcargument count命令行参数的总个数(整数)
argvargument vector命令行参数数组(字符串数组)

规则

  • argv[0]固定为程序名 / 程序路径
  • argv[1] ~ argv[argc-1]:用户输入的真正参数
  • argv[argc]:固定为 NULL(数组结束标记)
  • argc最小值 = 1

示例:

#include<stdio.h>#include<string.h>intmain(intargc,char*argv[]){for(inti=0;i<argc;i++){printf("argv[%d]: %s\n",i,argv[i]);}return0;}

总结:进程拥有一张argv表(命令行参数表),用来支持实现选项功能。

  • 内核加载程序时,会将命令行参数拷贝到进程内存,为进程自动创建 argv 表;
  • 每个进程都有独立的 argv 表,互不干扰、互不共享;
  • 程序通过main(argc, argv)直接访问这张表。

环境变量

基本概念

  • 环境变量(environment variables)一般是指在操作系统中用来指定操作系统运行环境的一些参数
  • 环境变量通常具有某些特殊用途,还有在系统当中通常具有全局特性
  • 格式固定:大写变量名=字符串值
  • 本质:进程的全局配置表

核心特性

  • 系统中每一个进程都有自己独立的环境变量表,进程之间环境变量相互隔离。
  • 父子进程默认继承:父进程通过fork()创建子进程时,子进程会完整复制父进程的环境变量表
  • 子进程修改自己的环境变量 不会影响父进程,父进程修改也不会影响已经创建好的子进程

核心作用

  1. 提供命令搜索路径(核心PATH),让系统不用写全路径就能执行命令
  2. 保存用户基本信息:家目录、用户名、当前工作目录
  3. 配置系统运行环境:语言编码、终端类型、动态库路径
  4. 为应用程序提供全局运行配置,无需修改代码即可改变程序行为

常见的环境变量

  1. PATH:命令搜索路径,多个路径用:分隔
  2. HOME:当前用户家目录
  3. USER:当前登录用户名
  4. PWD:当前所在工作目录
  5. OLDPWD上一次所在目录,cd -就是读取它
  6. SHELL:当前默认命令行解释器(一般/bin/bash
  7. HISTSIZE:内存中最多能保存多少条历史命令记录
  8. LD_LIBRARY_PATH:动态链接库搜索路径,程序运行时找依赖.so 库

Linux 环境变量 常用操作命令

  1. 查看环境变量
env# 查看所有环境变量echo$PATH# 查看单个环境变量echo$HOME
  1. 临时添加环境变量(只对当前这个终端窗口有效,关闭终端 → 变量立刻消失)
# 定义新环境变量export变量名="变量值"# 最常用:给 PATH 追加路径(**千万不要直接覆盖,要追加!**)exportPATH=$PATH:新路径
  1. 取消环境变量
unset变量名unsetTEST
  1. 永久生效(加载配置文件)
    修改完/etc/profile(系统全局永久添加) 或~/.bashrc(当前用户永久添加)后执行:
source~/.bashrc

环境变量 底层存储结构

  • 每个进程内部都有一张环境变量表,底层是字符串数组:char *environ[];
  • 数组中每一项都是NAME=VALUE格式字符串
  • 环境表末尾以NULL标记结束
  • 和命令行参数表argv[]并列,都是进程
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/11 12:29:35

金仓数据库 V9R4C19 安全加固实战:禁用 root 部署 + hashbytes 单向哈希

文章目录引言&#xff1a;两个看似平常的操作&#xff0c;暗藏安全隐患安全能力一&#xff1a;禁止 root 用户执行数据库部署为什么不能用 root&#xff1f;金仓的具体实现正确的部署方式给运维团队的建议安全能力二&#xff1a;hashbytes 单向哈希替代可逆加密可逆加密的致命弱…

作者头像 李华
网站建设 2026/5/11 12:28:50

从代码到图表:Mermaid Live Editor如何重塑技术文档可视化范式

从代码到图表&#xff1a;Mermaid Live Editor如何重塑技术文档可视化范式 【免费下载链接】mermaid-live-editor Edit, preview and share mermaid charts/diagrams. New implementation of the live editor. 项目地址: https://gitcode.com/GitHub_Trending/me/mermaid-liv…

作者头像 李华
网站建设 2026/5/11 12:28:32

【算法】小白也能懂 · 第 3 节:链表反转(迭代法、递归法)

链表反转是面试中出镜率最高的算法题之一,也是理解链表操作的最佳练习。这一节我们会用两种方法来实现:迭代法和递归法,并配合图解帮你真正搞懂每一步在干什么。 1. 什么是链表 在正式开始之前,先快速回顾一下链表的结构。 链表由一系列"节点"组成,每个节点包…

作者头像 李华
网站建设 2026/5/11 12:28:13

QGC界面切换背后的秘密:拆解MainToolBar.qml如何通过信号槽驱动五大视图

QGC界面切换背后的秘密&#xff1a;拆解MainToolBar.qml如何通过信号槽驱动五大视图 当你在QGroundControl(QGC)中点击底部工具栏的按钮时&#xff0c;整个界面会流畅地切换到对应的功能视图。这看似简单的交互背后&#xff0c;隐藏着QML框架精妙的信号槽机制和组件化设计思想…

作者头像 李华
网站建设 2026/5/11 12:27:41

C语言指针:从零掌握指针(4)

文章目录C语言指针&#xff1a;从零掌握指针&#xff08;4&#xff09;前言一、字符指针变量总结&#xff1a;二、数组指针变量2.1 是什么&#xff1f;2.2 怎么初始化&#xff1f;三&#xff0c;二维数组传参的本质总结:四&#xff0c; 函数指针变量4.1 函数指针变量的创建4.2 …

作者头像 李华