用路径搜索执行?

我想从我的代码中执行一个程序,并为它提供环境变量和参数。 AFAICT, execve是正确的选择。

但是, execve接收path参数,而不是filename ,这意味着它期望第一个参数是可执行文件的路径。

我知道我可以自己解析$PATH找到路径,但实际上,没有其他选择吗? 没有其他人在某处实现它供我使用吗?

有些系统可能提供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()execvpe()以及execvpe() )。

(我发现的execvpe()的实现通过实现execvp()逻辑然后使用execve()来执行程序来避免线程安全问题。)

通常,如果execvpe()返回,则进程将退出,因此通常恢复环境不会影响程序。 但是,它比抱歉更安全。