我需要导出多个变量,使它们在命令行中显示如下
export ROS_HOSTNAME=xxx
我该如何在C++中使用setenv()来实现这一点?
谢谢。
我需要导出多个变量,使它们在命令行中显示如下
export ROS_HOSTNAME=xxx
我该如何在C++中使用setenv()来实现这一点?
谢谢。
从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()函数将更新environ指向的指针列表。
由envname和envval描述的字符串将由此函数复制。
setenv()函数不需要是可重入的。不要求可重入的函数不要求是线程安全的。
返回值
成功完成时,将返回零。否则,将返回-1,设置errno以指示错误,并且环境不会更改。因此,您应该调用
或者setenv("ROS_HOSTNAME","xxx",1); // does overwrite
setenv("ROS_HOSTNAME","xxx",0); // does not overwrite
针对你的情况而言,这取决于你是否想要覆盖可能存在的定义。
注意:
你不能使用
setenv()
将变量从你的进程导出到调用进程(shell)!使用fork创建的子进程将继承当前进程的环境定义,因此也会继承你所做的更改和添加。
#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);
最后一个布尔参数表示如果您希望覆盖环境变量的值(如果它已经存在)。
像这样做:
setenv("ROS_HOSTNAME", "xxx", true);
请注意它的简介:
#include <stdlib.h>
int setenv(const char *envname, const char *envval, int overwrite);
请参阅此链接以获取有关setenv()
的更多详细信息。
setenv
的程序中可见,那么没有问题。如果您需要在运行程序后在shell中看到它们,请说明;虽然有(间接)的方法可以做到这一点,但除非您询问,否则我不会回答该问题。 - Keith Thompsonsetenv()
总是会“导出”environ
/envp
,除非fork的子进程传递了自定义的envp
,即execle()
。 - user246672