我想从我的代码中执行一个程序,并为它提供环境变量和参数。 AFAICT,execve
是正确的选择。
但是,execve
收到一个path
参数,而不是filename
,这意味着它希望第一个参数成为可执行文件的路径。
我知道我可以自己解析$PATH
找到路径,但实际上,没有别的选择吗?没有其他人在我的地方实现它吗?
答案 0 :(得分:8)
某些系统可能会提供execvpe()
。 Google搜索“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()
返回,则进程将退出,因此通常恢复环境不会影响程序。但是,它比抱歉更安全。