我需要编写使用 system() 函数设置路径的 C++ 程序:
system("set PATH=%PATH%;C:\\Program Files (x86)\\Microsoft Visual Studio 12.0\\VC\\bin\\amd64");
system("nvcc -x cu -o cudapair cudapair.c");
Run Code Online (Sandbox Code Playgroud)
但这不起作用。它会引发错误,因为未设置路径。有什么问题?
我需要编写使用 system() 函数设置路径的 C++ 程序
我假设您实际需要做的是编写一个 C++ 程序,为PATH随后执行的环境设置
nvcc -x cu -o cudapair cudapair.c
Run Code Online (Sandbox Code Playgroud)
您认为您需要使用该system功能进行环境设置,但实际上您不需要。
您应该了解进程无法改变其自身的环境。进程从其父进程继承其环境,并且可以更改其子进程继承的环境。
这就是为什么您发布的尝试不起作用。
system("set PATH=%PATH%;C:\\Program Files (x86)\\Microsoft Visual Studio 12.0\\VC\\bin\\amd64");
Run Code Online (Sandbox Code Playgroud)
执行程序的子进程。该子进程获得与您的程序相同的环境设置,并且无法更改它们。该子进程的作用是什么?它调用 Windows shell 来运行命令行:
set PATH=%PATH%;C:\\Program Files (x86)\\Microsoft Visual Studio 12.0\\VC\\bin\\amd64");
Run Code Online (Sandbox Code Playgroud)
这将更改由此命令行启动的任何更多子进程的环境设置。但没有。命令行进行了没有进程使用的环境设置。您的system电话回电。该环境设置不再存在于任何地方。什么也没有变。
然后你调用:
system("nvcc -x cu -o cudapair cudapair.c");
Run Code Online (Sandbox Code Playgroud)
它启动第二个子进程,同样使用与程序启动时相同的环境设置。
你应该做什么
PATH从程序继承的环境中获取价值。PATH使用该值创建要传递给子进程的新值。PATH您的子进程将继承的环境中。你system只用做4。
要执行1操作,请使用 Microsoft C 库函数getenv_s
(它是标准 C++ 的安全变体std::getenv)
要执行3操作,请使用 Microsoft C 库函数_putenv_s(注意前导下划线。)
下面是 Visual C++ 的说明性程序:
#include <iostream>
#include <string>
#include <cstdlib>
const std::size_t ENV_BUF_SIZE = 1024; // Enough for your PATH?
int main()
{
char buf[ENV_BUF_SIZE];
std::size_t bufsize = ENV_BUF_SIZE;
int e = getenv_s(&bufsize,buf,bufsize,"PATH");
if (e) {
std::cerr << "`getenv_s` failed, returned " << e << '\n';
exit(EXIT_FAILURE);
}
std::string env_path = buf;
std::cout << "In main process, `PATH`=" << env_path << std::endl;
env_path += ";C:\\Program Files (x86)\\Microsoft Visual Studio 12.0\\VC\\bin\\amd64";
e = _putenv_s("PATH",env_path.c_str());
if (e) {
std::cerr << "`_putenv_s` failed, returned " << e << std::endl;
exit(EXIT_FAILURE);
}
std::cout << std::endl;
e = std::system("echo \"In child process `PATH`=%PATH%\"");
if (e) {
std::cerr << "`std::system` failed, returned " << e << std::endl;
exit(EXIT_FAILURE);
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)