认识linux进程内存布局以及与命令行参数和环境变量的关系

1. 思考

  • 如下是 main函数 的原型,思考一个问题,我们通过命令行传递的参数,main函数 是如何获得的?环境变量 main函数又是如何获取的。

    c 复制代码
    /* 基础形式(无参数) */
    int main(void);
    /* 标准形式(可以获取命令行参数) */
    int main(int argc, char *argv[]);
    /* 扩展形式形式(可以获取命令行参数和环境变量),
       此形式是非标准的扩展​(C 标准未强制要求),
       但主流平台(Linux、Windows、macOS)普遍支持 */
    int main(int argc, char *argv[], char *envp[]);
  • 上述问题在理解了linux进程创建的基本流程,以及linux进程的内存布局,相信就能做到心中有数

2. linux进程内存布局

  • 在创建一个进程时通过fork() 完全将父进程复制一份,然后通过execve() 将要执行的任务加载到进程空间,进程空间的大致布局如下所示。

  • .text .rodata .data .bss stack heap 是可执行文件的代码段和数据段以及堆栈空间,在此便不过多赘述

  • mmap段 则为进程提供了一下灵活的机制,一般用来存放动态链接库,或者使用系统调用mmap() 创建内存映射时便是使用这部分空间,在本文中暂不展开。

  • 环境变量&命令行参数 是在进程运行前由execve()复制进来的,实时上除了mmap段动态加载的内容,其余部分都是进程运行前由execve() 复制进来的。

  • 通过cat /proc/self/maps可以查看当前进程内存布局

3. 进程如何获取命令行参数和环境变量

  • 至此,其实已经很清晰了,环境变量和命令行参数都是系统调用execve() 在加载进程时复制到进程空间的,main函数只需到对应的位置去取即可 ,如下是execve() 的原型,

    c 复制代码
    /* Replace the current process, executing PATH with arguments ARGV and
    environment ENVP.  ARGV and ENVP are terminated by NULL pointers.  */
    extern int execve (const char *__path, char *const __argv[],
    	   char *const __envp[]) __THROW __nonnull ((1, 2));
相关推荐
爱写代码的森3 小时前
鸿蒙三方库 | harmony-utils之ImageUtil图片保存到本地详解
服务器·华为·harmonyos·鸿蒙·huawei
大耳朵-小飞象5 小时前
电力安全运维的智能密码:BACS如何破解设备全生命周期管理难题,让电网安全“看得见、管得住”?
运维·安全·智慧城市·能耗系统·楼宇智控·未来生活
极客侃科技5 小时前
制造企业 MES/APS 选型:SAP PP/DS 集成、ERP-MES 边界划分与一体化架构要点
运维·架构·制造
HLC++6 小时前
Linux的进程间通信
android·linux·服务器
华清远见IT开放实验室7 小时前
实验室建设案例 | 石家庄科技信息职业学院嵌入式实验室——从底层硬件到系统应用,一所应用型高校的嵌入式人才培养这样落地
linux·arm开发·stm32·嵌入式硬件·高校·实验室建设
白露与泡影8 小时前
Arthas 实战指南:从方法耗时定位到 JVM 变量热修改
服务器·jvm·c#
神奇霸王龙9 小时前
Claude Code屠榜:MiMo与Grok紧追Codex
服务器·网络·人工智能·gpt·ai·ai编程
Web极客码9 小时前
WordPress SEO优化:提升网站排名的13个关键步骤
服务器·seo·wordpress
生活爱好者!9 小时前
我把NAS当作下载机,docker一键部署qb
运维·docker·容器
groundhappy10 小时前
idalib安装和codex ida-mcp配置
linux·开发语言·python