退出后从C++程序永久设置环境变量



我正在编写一个多次运行C++程序的bash脚本。我使用 getenv()putenv() 在 C++ 程序中创建、获取和更新环境变量。 C++程序结束后,bash 脚本需要抓取这些变量并执行一些基本逻辑。 问题是当C++程序退出时,环境变量消失。 有没有办法在程序终止后永久存储这些变量,以便 bash 脚本可以使用它们? 如果没有,在 bash 脚本和C++程序之间共享变量的最佳方法是什么? 我能想到的唯一解决方案是将输出写入文件。 我不想在控制台中打印此数据。 任何帮助将不胜感激。

每个进程都有自己的环境变量副本,这些变量是在启动新进程时通过从父进程复制它们来初始化的。当您更改流程中的环境变量时,父流程不知道这一点。

为了将信息从孩子传回给父母,您需要设置一些其他类型的通信渠道。它可以是磁盘上的文件,也可以是管道上的文件,或者(取决于父级的功能,bash可能无法完成所有这些操作)共享内存或某些其他 IPC 机制。然后,父程序将负责根据从子程序接收的信息更改自己的环境变量。

我个人只能在 16 位 DOS 汇编器中做到这一点,方法是跟踪指向前一个进程的指针,直到它指向自身,这意味着您已经到达了 COMMAND.COM 的第一个实例,然后手动更改了其环境。

如果您的程序通过标准输出以字符串形式返回变量,如下所示:

FOO=23; BAR=45;

然后,bash可以这样称呼它:

eval `./your_program`

结束$FOO和$BAR将可以访问 bash 访问。

要测试此尝试:

eval `echo "FOO=23; BAR=45;"`
echo "$FOO $BAR"

当然,在这种方法中,程序不会更改调用进程的环境变量(这是不可能的),而只是返回一个字符串,然后由 bash 计算,评估设置变量。

如果程序处理来自不受信任源的输入,请不要使用此方法。如果有人欺骗你的程序将"rm -rf/"打印到标准输出,你注定要失败。

据我所知,在"标准"GNU/Linux 环境中,您可以通过 3 种方式设置环境变量:

  • 使用命令行实用程序,如export
  • 编辑用户的~/.profile~/.bashrc等文件,或"为系统编辑/etc"下的等效文件
  • 将临时值提供给如下所示的命令CXX=g++ CUSTOM_VERSION=2.5 command

最后一个通常用于自定义构建,这很好,因为它不会损害系统,也不会干扰任何系统设置、值或文件,并且在执行命令后一切都恢复正常。如果您希望对一组特定的变量进行临时修改,这是最好的方法。

程序无法在其父级中设置环境变量。或者,好吧,没有合法的方式。用ptrace入侵其进程不算数。:-)

您应该做的是在标准输出上输出环境变量。让 shell 脚本读取并设置它们。如果环境变量是您输出的全部,则调用非常简单:

`program`

反勾将捕获程序的输出。然后它将用输出替换反引号。这将是设置外壳变量的命令。然后稍后在你的 shell 脚本中一定要这样做:

export VAR1
export VAR2

您需要导出命令才能将它们移动到传递给从 shell 启动的程序的环境中。

您无法设置在进程生命周期内幸存下来的环境变量,因此最简单的解决方案是按照您的建议写入输出文件或写入从 Bash 传递的特定文件句柄:

C++:

int main (int argc, char* argv[])
{
   // missing error handling
   int fd = atoi(argv[1]);
   const char* env = "BLAH=SMURF";
   write(5, env, strlen(env));
   return 0;
}

砰:

# discard stdout and stderr, redirect 5 to stdout so that it can be captured
# and tell the process that it should write to 5 (the first 5)
VARIABLES=`./command 5 2>&1 1>/dev/null 5>&1`

这可能是一个破解的想法,但它应该:)

相关内容

  • 没有找到相关文章

最新更新