我想从我的代码中执行一个程序,并为它提供环境变量和参数。afaict,execve
是正确的选择。
但是,execve
接收一个path
参数,而不是filename
,这意味着它希望第一个参数是可执行文件的路径。
我知道我可以通过解析自己来找到路径,但真的没有其他选择吗?没有其他人在某个地方实现它供我使用吗?
最佳答案
有些系统可能提供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()
返回,进程将退出,因此经常恢复环境不会影响程序。不过,安全总比道歉好。