我想从我的代码执行一个程序,并为其提供环境变量和参数。亚洲信息通信技术协会,execve
是正确的选择。
But, execve
收到一个path
论证,不是一个filename
,这意味着它期望第一个参数是可执行文件的路径。
我知道我可以解析$PATH
我自己寻找道路,但真的,没有其他选择吗?没有其他人在某个地方实现它供我使用吗?
有些系统可能会提供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()
and putenv()
以及在execvpe()
).
(实施execvpe()
我发现通过实现避免了线程安全问题execvp()
逻辑,然后使用execve()
来执行该程序。)
通常,如果execvpe()
返回时,进程将退出,因此恢复环境通常不会影响程序。然而,安全总比后悔好。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)