execvpe的便携式替代品

execvpe的便携式替代品,c,linux,libc,C,Linux,Libc,execvpe函数是GNU扩展。如果我希望我的代码可以移植到非gnu libcs,那么如何将execvpe调用更改为可移植 execvp不设置新程序的环境,execlepoth不允许将数组作为参数传递,也不尝试直接从PATH解析可执行文件 Per(加粗矿): 。。。此外,以下变量必须由用户声明(如果要直接使用): extern char **environ; 初始化为指向环境字符串的字符指针数组的指针。argv和environ数组均以空指针终止。终止argv数组的空指针不计入argc中 应用程

execvpe
函数是GNU扩展。如果我希望我的代码可以移植到非gnu libcs,那么如何将
execvpe
调用更改为可移植


execvp
不设置新程序的环境,
execle
poth不允许将数组作为参数传递,也不尝试直接从
PATH
解析可执行文件

Per(加粗矿):

。。。此外,以下变量必须由用户声明(如果要直接使用):

extern char **environ;
初始化为指向环境字符串的字符指针数组的指针。
argv
environ
数组均以空指针终止。终止
argv
数组的空指针不计入
argc

应用程序可以通过将
environ
变量指定给指向新环境字符串的字符指针数组,从而在一次操作中更改整个环境。

所以不是

exec...e( ...., myNewEnv );
你能行

extern char **environ;

   .
   .
   .

environ = myNewEnv;
exec...(...);

这个实现是开源的,你可以看看它做什么,然后自己做类似的事情。或者在“musl libc”中,请参见
exec*e()
函数有点多余的语法糖,这就是为什么它们没有被普遍实现的原因。直接设置
environ
。构造新的环境数组,而不是将其作为参数传递给
exec*e()
函数,只需执行
environ=newEnvArray;行政长官…()查看glibc中的实现实际上没有多大帮助,因为其他涉及路径的exec*函数实际上是使用execvpe实现的(因为它更通用)。execvpe确实调用了execve系统调用,但是使用PATH查找可执行文件的代码并不简单。