从c++中设置系统变量
Set system variable from C++
这个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::string
与putenv()
并不容易兼容。
另一种选择是使用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()
方法来转换它们。 - 如何访问基类向量中的子类变量?(对于实体组件系统)
- 如何设置Qt应用程序以使用类Unix系统的实际环境变量?
- 提供变量作为 MATLAB 系统命令的输入参数,以便C++可执行文件
- 将系统时间与变量进行比较 - C++
- 从系统("command") (C++) 设置变量
- 在系统( " " 中使用C++变量;
- 我们是否需要对多线程 x32 系统使用 lock 来读取或写入 uint32_t 变量
- 通过QT中的信号和插槽系统传递变量
- 从变量字符串中提升文件系统路径
- 如何在系统( "say string variable" )中使用字符串变量?
- C++中的程序如何使用"系统"变量与 Linux 中的 shell 脚本交互?
- 如何将 c ++ 变量的值传递给 hadoop HDFS 的 bash 系统命令?
- 在C++的系统中执行变量(" " )
- 在Boost文件系统中使用环境变量
- Visual studio 2012中针对包含系统变量的IntelliSense问题
- 映射多变量/层系统的泛化
- Wt Dbo MySQL 后端连接错误"SET storage_engine=INNODB;":未知的系统变量'storage_engine'
- 从c++中设置系统变量
- CMake 看不到系统变量
- 通过系统变量设置QT基目录