有些系统可能提供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;
}
Run Code Online (Sandbox Code Playgroud)
你可能无法生存rc(只是强行返回-1)因为execvp()只有永远返回-1(并且它只会在错误时返回).
您可能甚至不必担心此代码中的线程安全性.将使用它的正常方案就在a之后fork(),此时,进程中只有一个线程.如果您认为可以在有多个线程时使用它,那么您需要仔细考虑是否可以安全地修改全局环境.显然,如果execvp()成功,则不会出现问题(所有线程都会突然终止).如果execvp()失败,那么其他一个线程可能会看到修改后的环境,并可能在此基础上做出错误的决定.在这种情况下,你需要适当地保护环境(并可能涉及(互斥)锁定getenv(),setenv()和putenv()以及在execvpe()).
(execvpe()我发现的实现通过实现execvp()逻辑然后execve()用来执行程序来避免线程安全问题.)
通常,如果execvpe()返回,则进程将退出,因此经常恢复环境不会影响程序.但是,它比抱歉更安全.