【问题标题】:execve with path search?执行路径搜索?
【发布时间】:2011-10-17 05:36:11
【问题描述】:

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

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

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

【问题讨论】:

    标签: c exec execve


    【解决方案1】:

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

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

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

    【讨论】:

    • 谢谢!这就是我要找的:)
    • 警告:代码尚未经过正式测试 - 请谨慎使用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-07
    • 1970-01-01
    • 2012-01-01
    • 1970-01-01
    相关资源
    最近更新 更多