使用路径搜索的execve?

4

我希望能够从我的代码中执行一个程序,并提供环境变量和参数。据我所知,execve 是正确的选择。

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

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

1个回答

10

有些系统可能提供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;
}

由于execvp()只在错误时返回-1,因此您可能可以不使用rc(强制返回-1)而幸存。

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

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

通常,如果execvpe()返回,该进程将退出,因此重新设置环境通常不会影响程序。但是,保险起见还是最好。


警告:代码尚未正式测试 - 使用时请适当小心。 - Jonathan Leffler

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接