19

我需要导出几个变量,使它们在命令行中如下所示

export ROS_HOSTNAME=xxx

如何在 C++ 中使用 setenv() 来实现这一点?

谢谢。

4

3 回答 3

26

setenv()手动输入:

概要

#include <stdlib.h>  
int setenv(const char *envname, const char *envval, int overwrite);

说明
setenv() 函数应在调用进程的环境中更新或添加变量。envname 参数指向一个字符串,该字符串包含要添加或更改的环境变量的名称。环境变量应设置为 envval 指向的值。如果 envname 指向包含“=”字符的字符串,则该函数将失败。如果以 envname 命名的环境变量已经存在且 overwrite 的值非零,则函数应返回成功并更新环境。如果以 envname 命名的环境变量已经存在,并且 overwrite 的值为零,则函数返回成功,环境保持不变。

如果应用程序修改了 environ 或其指向的指针,则 setenv() 的行为未定义。setenv() 函数将更新环境指向的指针列表。

由 envname 和 envval 描述的字符串由该函数复制。

setenv() 函数不需要是可重入的。不需要可重入的函数不需要是线程安全的。

返回值
成功完成后,应返回零。否则返回-1,设置errno表示错误,环境不变。

所以你应该打电话

setenv("ROS_HOSTNAME","xxx",1); // does overwrite

或者

setenv("ROS_HOSTNAME","xxx",0); // does not overwrite

对于你的情况。取决于,如果你想覆盖一个可能存在的定义。

笔记:

您不能使用setenv()将变量从进程导出到调用进程(shell)!使用 fork 创建的子进程将继承当前进程环境定义,因此也将继承您的更改和添加。

于 2013-07-29T16:48:02.210 回答
0

这样做

setenv("ROS_HOSTNAME", "xxx", true);

请注意它的概要:

#include <stdlib.h>

int setenv(const char *envname, const char *envval, int overwrite);

有关更多详细信息,请参阅此链接setenv()

于 2013-07-29T16:51:36.380 回答
0

这里是 setenv 函数的签名

#include <stdlib.h>

int setenv(const char *envname, const char *envval, int overwrite);

链接: http: //pubs.opengroup.org/onlinepubs/009695399/functions/setenv.html

在你的情况下,你这样称呼它:

setenv("ROS_HOSTNAME", "xxx", true);

最后一个布尔参数指示是否要覆盖环境变量的值(如果它已经存在)。

于 2013-07-29T16:43:51.023 回答