关于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的并将其放置到新的内存映射中,或者其他一些技巧?
发布于 2012-08-18 06:53:24
是。
当进程调用exec时,内核会复制整个argv和envp数组。然后,将它们复制到新的进程映像中--特别是,当程序开始运行时,其堆栈看起来如下:
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.S、glibc/sysdeps/x86_64/start.S或glibc/ports/sysdeps/arm/start.S )中完成的,这些代码的存在只是为了启动启动main的glibc/csu/libc-start.c中的__libc_start_main。)
https://stackoverflow.com/questions/12016441
复制相似问题