关于fexecve函数envp[]参数的疑问及ELF二进制适配咨询
fexecve 参数问题解答
问题1:关于envp参数的理解纠正
你对fexecve第三个参数envp[]的理解完全错误。envp是传递给新进程的环境变量数组,和execve的envp作用完全一致,用来传递PATH、HOME这类进程运行时依赖的环境变量,根本不是指定执行文件的解释器路径。
如果要执行Python脚本,要么脚本开头写#!/usr/bin/python3的shebang,要么调用fexecve执行Python解释器,把脚本路径作为argv参数传递,而非把解释器路径放到envp里。
问题2:ELF二进制文件的envp参数传入内容
对于ELF二进制文件,envp的要求和普通execve完全相同:
- 传入一个以
NULL指针结尾的字符串数组,每个元素是"KEY=VALUE"格式的环境变量 - 可以直接复用当前进程的环境变量数组(比如全局变量
environ) - 也可以自定义环境变量数组,示例:
char *my_env[] = {"PATH=/usr/bin", "HOME=/home/user", NULL};
关于空char*[]参数报错的问题
fexecve的argv和envp参数有严格要求:
argv必须是非空且以NULL结尾的数组,至少要包含argv[0](通常是程序的名称或路径)envp同样必须是以NULL结尾的数组(可以是空数组,但必须有结尾的NULL指针)
你传入空的char*[](没有NULL结尾,或连argv[0]都缺失),内核会判定为无效参数,触发EINVAL错误(即你看到的invalid argument)。比如正确的空环境变量数组写法:
char *empty_env[] = {NULL};
argv的最低要求写法:
char *argv[] = {"my_program", NULL};
内容的提问来源于stack exchange,提问作者R-Rothrock
相关产品推荐
相关产品推荐

