C 执行路径搜索?
我想从我的代码中执行一个程序,并为它提供环境变量和参数。AFAICT,C 执行路径搜索?,c,exec,execve,C,Exec,Execve,我想从我的代码中执行一个程序,并为它提供环境变量和参数。AFAICT,execve是正确的选择 但是,execve接收一个path参数,而不是filename,这意味着它希望第一个参数是可执行文件的路径 我知道我可以自己解析$PATH来找到路径,但真的没有其他选择吗?没有其他人在某个地方实现它供我使用吗?一些系统可能会提供execvpe()。谷歌搜索“execvpe”显示了多种选项,包括至少一个实现(比下面的要复杂得多,但它在自己的代码中包含了大部分execvp()) 对于那些没有的,您可以自己
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()
返回,进程将退出,因此恢复环境通常不会影响程序。不过,安全总比抱歉好。谢谢!这就是我想要的:)警告:代码尚未正式测试-请谨慎使用。