2011-10-17 130 views
4

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

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

我知道我可以自己解析$PATH找到路径,但是真的,有没有别的选择?没有其他人在某处使用它?

回答

8

某些系统可能会提供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()返回时,进程将退出,所以很多时候恢复环境不会影响程序。然而,这比安慰更安全。

+0

谢谢!这是我正在寻找:) – abyx

+0

警告:该代码尚未正式进行测试 - 谨慎使用。 –