如何使用 system() 函数设置 C++ 程序内部的路径

use*_*634 1 c++ system path

我需要编写使用 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)

但这不起作用。它会引发错误,因为未设置路径。有什么问题?

Mik*_*han 5

我需要编写使用 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)

它启动第二个子进程,同样使用与程序启动时相同的环境设置。

你应该做什么

  1. PATH从程序继承的环境中获取价值。
  2. PATH使用该值创建要传递给子进程的新值。
  3. 将新值放入PATH您的子进程将继承的环境中。
  4. 运行您的子进程。

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)

现场观看