4

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

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

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

4

1 回答 1

9

一些系统可能会提供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(并且它只会在错误时返回)。

您甚至可能不必担心此代码中的线程安全性。将使用它的正常情况是在 a 之后fork(),此时,进程中只有一个线程。如果您认为可以在周围有多个线程时使用它,那么您需要仔细考虑一下是否可以安全地修改全局环境,即使是短暂的。显然,如果execvp()成功,就不会有问题(所有线程都会被突然终止)。如果execvp()失败,那么其他线程之一可能会看到修改后的环境,并可能基于此做出错误的决定。在这种情况下,您需要适当地保护环境(这可能涉及(互斥)锁定getenv()setenv()以及putenv()execvpe()

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

通常,如果execvpe()返回,进程将退出,因此通常恢复环境不会影响程序。但是,安全总比后悔好。

于 2011-10-17T05:43:51.587 回答