从c++中设置系统变量

Set system variable from C++

本文关键字:系统 变量 设置 c++      更新时间:2023-10-16

这个shell脚本

#!/bin/csh
set VAR=12345
echo $VAR

将在shell上和平地输出12345。我需要使用c++在代码的某些部分做同样的事情:

string str = "12345";
retValue="set var1= "+str;      
system(retValue1.c_str());
system("echo $var1");

这不会创建一个系统变量var1并返回null,这是可以理解的,因为每个系统函数都会创建一个具有不同环境变量的子进程。所以我用一个系统功能将它们组合如下…但是它又返回null

retValue="set var1= "+str;
retValue1=retValue+";n echo $var1";
system(retValue1.c_str());

谁能指导我通过c++设置系统变量。提前感谢!

<cstdlib>:

#include <cstdlib>
setenv("VAR", "12345", true);

你基本上不能这么做。

您可以调用putenv来更改您自己的进程和所有未来的子进程中的环境变量,但是没有办法(这很好)来更改父进程 shell进程的环境。

您可以为您的c++程序设置一个使用约定,例如,它输出一些shell命令以供用户获取(或eval -ed)。ssh-agent -s就是一个例子。

您可以使用putenv()

#include <cstdlib>
...
putenv("VAR=12345");

这很方便,但是putenv不会复制字符串。这意味着如果您稍后修改它,那么您将修改环境。对于文字来说,这不是问题,但是您形成字符串的方式,使用std::stringputenv()并不容易兼容。

另一种选择是使用setenv()

#include <cstdlib>
...
setenv("VAR", "12345", true);

对于setenv(),生成输入的副本,并且在调用setenv()之后可以安全地处理字符串。

您想要的函数可能是putenv()。您没有指定您使用的是哪个操作系统,所以我假设是Linux,因为这是我手边的手册页:

int putenv(char *string);

putenv()函数的作用是增加或修改environment的值变量。参数字符串的形式是name=value。如果名字环境中不存在的字符串,则将字符串添加到环境。方法中name的值环境变成了价值。字符串所指向的字符串成为环境的一部分,因此更改字符串会更改环境。

IIRC, win32上也有一个putenv。最后你可以试着看看这个问题,可能是dup

以上答案正确解释了如何从c++程序中设置环境变量,基本上是setenv()

我想说的唯一一点是为什么你的方法不起作用?原因是,当加载进程时,system命令将加载新的上下文—相当于一个新的shell。实际上,您的环境变量正在设置,但是当您返回时它丢失了。

参考此http://pubs.opengroup.org/onlinepubs/007904975/functions/setenv.html。

事实上,setenv()设置了进程的env变量!这就是为什么它对你有效。

请注意,在<cstdlib>标题中可用的函数中,CPPreference站点似乎没有提到setenv,只有getenv。这可能不是问题,因为我可以在带有GCC 9.1的Centos 7系统上使用setenv通过#include - <cstdlib>。我怀疑在大多数情况下,<cstdlib>只是<stdlib.h>的一个薄包装。

另一件需要注意的小事是,setenv接受c风格的字符参数(也适用于要设置的环境变量的)。如果您使用c++字符串(您应该这样做),不要忘记使用它们的.c_str()方法来转换它们。