C 执行路径搜索?

C 执行路径搜索?,c,exec,execve,C,Exec,Execve,我想从我的代码中执行一个程序,并为它提供环境变量和参数。AFAICT,execve是正确的选择 但是,execve接收一个path参数,而不是filename,这意味着它希望第一个参数是可执行文件的路径 我知道我可以自己解析$PATH来找到路径,但真的没有其他选择吗?没有其他人在某个地方实现它供我使用吗?一些系统可能会提供execvpe()。谷歌搜索“execvpe”显示了多种选项,包括至少一个实现(比下面的要复杂得多,但它在自己的代码中包含了大部分execvp()) 对于那些没有的,您可以自己

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

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


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

一些系统可能会提供
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()
返回,进程将退出,因此恢复环境通常不会影响程序。不过,安全总比抱歉好。

谢谢!这就是我想要的:)警告:代码尚未正式测试-请谨慎使用。