我想从我的代码执行一个程序,并为其提供环境变量和参数。 AFAICT,execve
是正确的选择。execve带路径搜索?
但是,execve
收到path
参数,而不是filename
,这意味着它期望第一个参数是可执行文件的路径。
我知道我可以自己解析$PATH
找到路径,但是真的,有没有别的选择?没有其他人在某处使用它?
我想从我的代码执行一个程序,并为其提供环境变量和参数。 AFAICT,execve
是正确的选择。execve带路径搜索?
但是,execve
收到path
参数,而不是filename
,这意味着它期望第一个参数是可执行文件的路径。
我知道我可以自己解析$PATH
找到路径,但是真的,有没有别的选择?没有其他人在某处使用它?
某些系统可能会提供execvpe()
。谷歌搜索'execvpe'显示了各种选项,包括至少一个实现(比后面的实现复杂得多,但它包含大部分execvp()
在它自己的代码中)。
对于那些不这样做,你可以为自己提供它:
int execvpe(const char *program, char **argv, char **envp)
{
char **saved = environ;
int rc;
environ = envp;
rc = execvp(program, argv);
environ = saved;
return rc;
}
你很可能没有rc
生存(只是强制遣返-1),因为execvp()
永远只能返回-1
(和它永远只能返回上一个错误)。
在这段代码中,你可能甚至不用担心线程安全。正常情况下,将使用它是在fork()
之后,并且此时,进程中只有一个线程。如果你认为在有多个线程时可以使用它,那么你需要相当仔细地考虑是否可以简单地修改全球环境是否安全。显然,如果execvp()
成功,就不会有问题(所有线程都会突然终止)。如果execvp()
失败,那么其他线程可能会看到修改的环境,并可能基于此做出错误的决定。在这种情况下,您需要适当保护环境(并且可能涉及(互斥)锁定getenv()
,setenv()
和putenv()
以及execvpe()
)。
(的execvpe()
我找到了实现通过实施execvp()
逻辑,然后使用execve()
执行程序避免了线程安全问题。)
通常情况下,如果execvpe()
返回时,进程将退出,所以很多时候恢复环境不会影响程序。然而,这比安慰更安全。
谢谢!这是我正在寻找:) – abyx
警告:该代码尚未正式进行测试 - 谨慎使用。 –