我有一个关于Linux如何处理传递给execve()的环境变量的问题:
execve()的概要如下: int execve(const char *filename, char *const argv[], char *const envp[]);
在调用execve()之前,我们从当前进程的内存映射中分配用于保存envs/args的内存。但是在执行完execve()之后,调用进程的所有文本/数据/bss/堆栈都被新程序覆盖,并且旧进程的所有内存映射都不被保留(包括传递的envs/args的内存)。
对于新程序来说,它从哪里读取envs/args?内核是否会复制传递的envs/args并将其放置到新的内存映射中,还是使用其他技巧?
execve()的概要如下: int execve(const char *filename, char *const argv[], char *const envp[]);
在调用execve()之前,我们从当前进程的内存映射中分配用于保存envs/args的内存。但是在执行完execve()之后,调用进程的所有文本/数据/bss/堆栈都被新程序覆盖,并且旧进程的所有内存映射都不被保留(包括传递的envs/args的内存)。
对于新程序来说,它从哪里读取envs/args?内核是否会复制传递的envs/args并将其放置到新的内存映射中,还是使用其他技巧?
main
函数中的argc
和argv
读取参数。我还猜想调用execve
的程序将从其主函数返回并进入加载器,在加载器中,加载器将设置所有环境和参数,就像正常执行程序一样。这只是我的猜测,所以可能完全错误。 - nhahtdh