我想从我的代码中执行一个程序,并为它提供环境变量和参数。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()返回,进程将退出,因此经常恢复环境不会影响程序。不过,安全总比道歉好。

08-16 08:25