如何在C++中使用setenv()导出变量?

22

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

export ROS_HOSTNAME=xxx

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

谢谢。


你在问题的上下文中提到 [tag:command-line] 标签的原因是什么?你需要在哪里“导出”?请详细说明! - πάντα ῥεῖ
2
这些环境变量需要在什么情况下可见?如果它们只需要在调用setenv的程序中可见,那么没有问题。如果您需要在运行程序后在shell中看到它们,请说明;虽然有(间接)的方法可以做到这一点,但除非您询问,否则我不会回答该问题。 - Keith Thompson
1
“Exporting”是一个shell特性setenv()总是会“导出”environ/envp,除非fork的子进程传递了自定义的envp,即execle() - user246672
3个回答

28

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创建的子进程将继承当前进程的环境定义,因此也会继承你所做的更改和添加。


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);

最后一个布尔参数表示如果您希望覆盖环境变量的值(如果它已经存在)。


0

像这样做

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

请注意它的简介:

#include <stdlib.h>

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

请参阅此链接以获取有关setenv()的更多详细信息。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接