首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >execve()和环境变量

execve()和环境变量
EN

Stack Overflow用户
提问于 2012-08-18 06:32:04
回答 1查看 6.5K关注 0票数 4

关于Linux如何处理环境变量传递给execve()的问题,我有一个问题:

execve()的同步:int execve(const char *filename,char *const argv[],char *const envp[]);

在调用execve()之前,我们分配内存用于保存当前进程的内存映射中的envs/args。但是在execve()之后,调用进程的所有文本/数据/bss/堆栈都会被新程序覆盖,旧进程的所有内存映射都不会被保留(包括传递的envs/args的内存)。

对于新的程序,在哪里读取env/args?内核是否复制已传递的env/args的并将其放置到新的内存映射中,或者其他一些技巧?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-08-18 06:53:24

是。

当进程调用exec时,内核会复制整个argvenvp数组。然后,将它们复制到新的进程映像中--特别是,当程序开始运行时,其堆栈看起来如下:

代码语言:javascript
复制
NULL
...
envp[1]
envp[0]
NULL
argv[argc-1]
...
argv[1]
argv[0]
argc

_start中的Glibc启动代码将其转换为适当的形式来调用main

(有关更多细节,来自旧进程的复制是在linux/fs/exec.c中完成的,对新进程的复制是在linux/fs/binfmt_elf.c中完成的,程序启动是在特定于体系结构的代码(如glibc/sysdeps/i386/start.Sglibc/sysdeps/x86_64/start.Sglibc/ports/sysdeps/arm/start.S )中完成的,这些代码的存在只是为了启动启动mainglibc/csu/libc-start.c中的__libc_start_main。)

票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12016441

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档