前言:欢迎各位光临本博客,这里小编带你直接手撕Linux程序地址空间,文章并不复杂,愿诸君耐其心性,忘却杂尘,道有所长!!!!

解释_chmod_命令_(3).gif

**🔥个人主页:IF’Maxue-CSDN博客

🎬作者简介:C++研发方向学习者

📖**个人专栏:
《C语言》
《C++深度学习》
《Linux》
《数据结构》
《数学建模》
**

⭐️人生格言:生活是默默的坚持,毅力是永久的享受。不破不立,远方请直行!

文章目录

    • 一、环境变量:系统的“运行说明书”
      • 1. 为什么系统命令不用“找路”?靠PATH!
      • 2. 环境变量从哪来?bash“读配置”来的
      • 3. 常用环境变量:记这几个就够了
      • 4. 操作环境变量:3个常用命令
      • 5. 代码里怎么获取环境变量?3种方法
        • 方法1:main函数的第三个参数envp
        • 方法2:getenv函数(推荐!)
        • 方法3:全局变量environ
    • 二、程序地址空间:不是内存,是“虚拟地图”
      • 1. C程序的地址空间划分
      • 2. 关键:程序地址空间 ≠ 物理内存

一、环境变量:系统的“运行说明书”

你可以把环境变量理解成Linux系统的“小记事本”——里面记满了程序运行、系统操作需要的关键信息,比如“去哪找你要运行的程序”“现在登录的是谁”“当前在哪个文件夹”,有了它,系统和程序才知道该“怎么干活”。

1. 为什么系统命令不用“找路”?靠PATH!

你有没有好奇过:输入ls“列出文件”、pwd“看当前路径”时,为什么不用像自己写的程序那样输全路径(比如/home/xxx/myprogram)?答案就是PATH环境变量

  • PATH的作用:专门记录“程序存放路径”的列表。系统执行ls这类命令时,会顺着PATH里的路径挨个找,找到对应的程序文件就运行,找不到就提示“命令不存在”。
  • 怎么看PATH?用echo $PATH(注意$是“调用环境变量”的符号),就像这张图里展示的:
    image.png
    图里用echo $PATH输出的一串路径,就是系统找程序的“地图”。
  • 验证一下:如果把PATH里的路径清空(比如PATH=),再输ls就会提示“找不到命令”;再用PATH=$PATH:/bin/binls所在的路径)加回去,ls又能正常用了,就像这张图:
    image.png

如果不小心改坏了PATH也别怕——重启电脑后,系统会重新加载配置,PATH就恢复原样了。

2. 环境变量从哪来?bash“读配置”来的

每次你登录Linux,系统会启动一个“命令解释器”——bash(就是你输命令的窗口)。bash不会凭空生成环境变量,而是去读两个关键配置文件:bashrcprofile,从里面加载预设的环境变量。

  • 多用户登录的情况:如果10个用户同时登录Linux,就会启动10个bash,每个bash都会读自己的配置文件,所以每个用户的环境变量可以不一样,就像这张图里的调用关系:
    image.png

3. 常用环境变量:记这几个就够了

除了PATH,还有几个常用的环境变量,用echo $变量名就能查看,对应这张图里的内容:
image.png

环境变量作用(通俗说)例子
USER当前登录的用户名echo $USER 输出 root 或你的用户名
HISTSIZE保存多少条历史命令默认存1000条,输过的命令都在这
HOSTNAME这台电脑的“名字”echo $HOSTNAME 看电脑名
PWD当前所在的文件夹路径比如在/home,就输出/home

比如这张图里的PWD,就是当前的路径:
image.png

4. 操作环境变量:3个常用命令

环境变量分两种:本地变量(只有当前bash能用,子进程用不了)和环境变量(子进程也能继承),用以下命令切换和操作:

  1. export:把本地变量变成环境变量
    比如先定义一个本地变量a=123,这时候运行子进程(比如自己写的程序)拿不到a;用export a之后,a就变成环境变量,子进程也能访问了,就像这张图:
    image.png

  2. unset:删除环境变量
    想删掉某个环境变量,比如a,就输unset a,之后echo $a就看不到值了,对应这张图:
    image.png

  3. set:查看所有变量
    set能看到所有本地变量和环境变量,方便排查问题。

5. 代码里怎么获取环境变量?3种方法

自己写C程序时,想拿到系统的环境变量,有3种常用方法:

方法1:main函数的第三个参数envp

main函数其实能接3个参数(不是只有int main()!),第三个参数envp是个字符串数组,每个元素都是一个环境变量(格式是“变量名=值”):

#include <stdio.h>
// argc:参数个数,argv:命令行参数,envp:环境变量列表
int main(int argc, char *argv[], char *envp[]) {// 循环打印所有环境变量int i = 0;while (envp[i] != NULL) {printf("%s\n", envp[i]);i++;}return 0;
}

就像这张图里的main函数参数说明:
image.png

方法2:getenv函数(推荐!)

想直接拿某个环境变量(比如PATH),用getenv("变量名")最方便,返回值就是变量的值:

#include <stdio.h>
#include <stdlib.h> // getenv需要的头文件int main() {// 拿PATH环境变量的值char *path = getenv("PATH");// 拿USER环境变量的值char *user = getenv("USER");printf("PATH: %s\n", path);printf("USER: %s\n", user);return 0;
}

编译运行后,就能看到PATH和USER的值,对应这张图:
image.png

方法3:全局变量environ

系统有个全局二级指针environ,专门存环境变量,需要用extern声明后才能用:

#include <stdio.h>// 声明全局变量environ
extern char **environ;int main() {int i = 0;// 循环打印所有环境变量while (environ[i] != NULL) {printf("%s\n", environ[i]);i++;}return 0;
}

就像这张图里的environ说明:
image.png

二、程序地址空间:不是内存,是“虚拟地图”

你写C程序时,可能以为指针指向的是“物理内存地址”——其实不是!程序里的地址都是“虚拟地址”,而“程序地址空间”就是系统给进程画的一张“虚拟地图”。

1. C程序的地址空间划分

C程序运行时,代码和数据会被分到不同的“区域”,就像这张图里展示的:
image.png

用通俗的话解释这几个区域:

  • 代码段:存你的代码(比如printfmain函数),是“只读”的——你不能改代码里的内容,比如字符串常量"hello"就存在这,像这张图里说的“字符串被编译成代码,只读”:
    image.png
  • 数据段:存全局变量和static变量(比如int g_val = 10;static int s_val = 20;),程序一启动就分配空间。
  • :存你手动申请的内存(比如malloc(10)new int),需要自己freedelete释放。
  • :存函数里的局部变量(比如int a = 5;),函数结束后自动释放。

2. 关键:程序地址空间 ≠ 物理内存

很多人会把“程序地址空间”和“物理内存”搞混,其实它们的关系是:

  • 程序地址空间 = 虚拟地址空间:是系统给进程分配的“地址范围”(比如0~4GB),进程以为自己独占这部分地址。
  • 物理内存:电脑里真实的内存条(比如8GB、16GB),系统会把“虚拟地址”转换成“物理地址”,再去访问真实内存。

就像这张图里强调的:C/C++指针用的都是虚拟地址,程序地址空间是“系统概念”,不是“语言概念”:
image.png

简单说:进程拿着“虚拟地址”(地图上的位置),系统帮它找到“物理地址”(真实的房子),这样既能保护内存安全(进程看不到彼此的地址),又能高效利用内存。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/bicheng/95654.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/95654.shtml
英文地址,请注明出处:http://en.pswp.cn/bicheng/95654.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

机器学习 - Kaggle项目实践(8)Spooky Author Identification 作者识别

Spooky Author Identification | Kaggle Approaching (Almost) Any NLP Problem on Kaggle &#xff08;参考&#xff09; Spooky Author Identification | Kaggle &#xff08;My work&#xff09; 根据三位的一些作品训练集&#xff0c;三分类测试集是哪个作家写的概率。 …

[frontend]WebGL是啥?

对于初学者来说&#xff0c;通常的建议是&#xff1a; 不要直接从原生 WebGL 开始&#xff0c;而是先使用一个基于 WebGL 的高级框架或库&#xff0c;最著名的就是 Three.js。 webgl是啥 three.js是啥&#xff1f; Three.js 封装了 WebGL 的复杂细节&#xff0c;提供了更简单、…

[光学原理与应用-400]:设计 - 深紫外皮秒脉冲激光器 - 元件 - 声光调制器AOM

声光调制器&#xff08;Acousto-Optic Modulator, AOM&#xff09;是深紫外皮秒脉冲激光器中实现脉冲主动控制、频率稳定及光束管理的核心元件。其通过声波与光波的弹光相互作用&#xff0c;在皮秒时间尺度内实现激光强度、频率或传播方向的精准调制。以下从工作原理、关键性能…

25高教社杯数模国赛【D题顶流思路+问题分析】

注&#xff1a;本内容由”数模加油站“ 原创出品&#xff0c;虽无偿分享&#xff0c;但创作不易。欢迎参考teach&#xff0c;但请勿抄袭、盗卖或商用。后续都在”数模加油站“......

利用 openssl api 实现 TLS 双向认证

1. 环境 openssl1.1.1gwget https://github.com/openssl/openssl/releases/download/OpenSSL_1_1_1g/openssl-1.1.1g.tar.gz sha256 为&#xff1a; ddb04774f1e32f0c49751e21b67216ac87852ceb056b75209af2443400636d46Linux 环境 2. 静态编译 openssl tar -zxvf openssl-1.1.1…

低代码开发平台技术总结

一、 核心定义 低代码开发平台&#xff08;Low-Code Development Platform, LCDP&#xff09;是一种通过图形化界面、可视化建模、拖拽组件和模型驱动逻辑来构建应用程序的开发环境。其核心目标是显著减少传统手写代码的数量&#xff0c;从而降低开发门槛&#xff0c;提升应用交…

Web与Nginx网站服务

文章目录前言1、Web 概念1.1 Web 的特点1.2 B/S 架构模型1.3 Web 请求与响应过程1.4 静态资源与动态资源1.5 Web 的发展阶段1.6 小结2、HTTP 与 HTTPS 协议2.1 http与https区别2.2 HTTPS 握手流程2.3 HTTP状态码2.3.1 HTTP 状态码概览2.3.2 常用状态码详解3、Nginx 概念3.1 Ngi…

【算法--链表】25.K个一组翻转链表--通俗讲解

一、题目是啥?一句话说清 给你一个链表,每k个节点一组进行反转,如果最后剩余的节点不足k个,则保持原状。需要实际交换节点,而不仅仅是改变值。 示例: 输入:head = [1,2,3,4,5], k = 2 输出:[2,1,4,3,5](因为每2个一组反转,最后剩余5不足2个,保持原状) 二、解题核…

Git指令 | 个人学习笔记

主要包含git的日常核心操作。 1.创建新仓库 创建新文件夹&#xff0c;打开&#xff0c;然后执行。 git init2.创建一个本地仓库的克隆版本 先cd到指定的目录下&#xff0c;再 git clone /path/to/respository # 指定远程分支 git clone -b <分支名> <仓库地址> …

Apache 的安装及基本使用

1 Apache 简介Apache HTTP Server&#xff08;通常简称 “Apache”&#xff09;是世界上最流行、历史最悠久的开源 Web 服务器软件之一&#xff0c;由 Apache 软件基金会&#xff08;Apache Software Foundation&#xff09;维护。它的核心功能是接收客户端&#xff08;如浏览器…

五大主流大语言模型(LLM)对比

文章目录&#x1f916; 五大主流大型语言模型&#xff08;LLM&#xff09;对比1. ChatGPT (GPT-5) - OpenAI2. Claude 4 (Sonnet & Opus) - Anthropic3. Gemini 2.5 Pro - Google DeepMind4. Grok 4 - xAI5. DeepSeek R1 - 深度求索五款模型的综合对比表&#x1f680; 该如…

redo log详解

在 MySQL 中&#xff0c;Redo Log&#xff08;重做日志&#xff09; 是 InnoDB 存储引擎实现事务持久性&#xff08;ACID 中的 D&#xff09; 的核心机制&#xff0c;同时也通过 “预写日志&#xff08;Write-Ahead Logging, WAL&#xff09;” 策略提升了数据写入性能。它记录…

Linux awk命令完全指南:从原理到实战,搞定文本处理难题

在Linux世界里&#xff0c;文本处理是运维、开发绕不开的日常——从分析日志、提取配置信息到统计数据&#xff0c;都需要高效的工具支撑。而awk&#xff0c;作为一款强大的文本分析语言&#xff0c;凭借“按字段处理”的核心能力&#xff0c;成为了比grep&#xff08;单纯匹配…

毕业项目推荐:68-基于yolov8/yolov5/yolo11的水稻虫害检测识别系统(Python+卷积神经网络)

文章目录 项目介绍大全&#xff08;可点击查看&#xff0c;不定时更新中&#xff09;概要一、整体资源介绍技术要点功能展示&#xff1a;功能1 支持单张图片识别功能2 支持遍历文件夹识别功能3 支持识别视频文件功能4 支持摄像头识别功能5 支持结果文件导出&#xff08;xls格式…

Qt为什么要引入QML语言?

Qt发布于1991年&#xff0c;经过30多年的发展&#xff0c;Qt/C已经成为了众多学子&#xff0c;拿来学习C的首选框架。Qt/Widgets&#xff0c;相对于其他界面库&#xff08;如GNOME、KDE&#xff09;&#xff0c;其实已经很优秀&#xff0c;已经可以成为number one了。在已经是第…

设计模式在Java中的应用:从单例模式到工厂模式的全面解析!

全文目录&#xff1a;开篇语前言1. 单例模式&#xff1a;确保全局只有一个实例1.1 饿汉式单例1.2 懒汉式单例1.3 双重检查锁定&#xff08;DCL&#xff09;2. 工厂模式&#xff1a;简化对象创建2.1 简单工厂模式2.2 工厂方法模式2.3 抽象工厂模式3. 其他设计模式3.1 观察者模式…

Meta AIUCSD放大招:DeepConf 让大语言模型推理既快又准,84.7%的token节省+近乎完美的准确率!

1. 【前言】 Meta&UCSD 大语言模型&#xff08;LLMs&#xff09; 在推理任务中通过自一致性等测试时缩放方法展现出巨大潜力&#xff0c;但存在精度收益递减和计算开销高的问题。为此&#xff0c;Meta与UCSD的研究人员提出DeepConf方法&#xff0c;它利用模型内部的置信度信…

解决leetcode第3671.子序列美丽值求和问题

3671. 子序列美丽值求和难度&#xff1a;困难问题描述&#xff1a;给你一个长度为 n 的整数数组 nums。对于每个 正整数 g&#xff0c;定义 g 的 美丽值 为 g 与 nums 中符合要求的子序列数量的乘积&#xff0c;子序列需要 严格递增 且最大公约数&#xff08;GCD&#xff09;恰…

电机控制(一)-电机分类

电机分类 电机分类&#xff1a; 电机的拓扑模型并没有发生太大变化,变化较大的是控制电机的方法。 常见的电机类型有&#xff1a; 步进电机vs伺服电机 在工业自动化、机器人、精密设备等领域&#xff0c;步进电机和伺服电机是两种最常用的驱动电机&#xff0c;但两者的核心…

【Qt】QToolBar、QToolButton的常用用法

一、QToolBar 常用用法 QToolBar 是 Qt 中用于创建工具栏的控件&#xff0c;可快速放置常用功能按钮、分隔符或自定义控件&#xff0c;并支持拖动停靠、浮动等特性。 1. 基础创建与添加到主窗口 // 在 QMainWindow 中创建工具栏 QToolBar *toolBar new QToolBar(tr("主工…