【问题标题】:How to use setenv() to export a variable in c++?如何使用 setenv() 在 C++ 中导出变量?
【发布时间】:2013-07-29 16:37:04
【问题描述】:

我需要导出几个变量,使它们在命令行中如下所示

export ROS_HOSTNAME=xxx

如何在 c++ 中使用 setenv() 来实现?

谢谢。

【问题讨论】:

  • 您在问题的上下文中提到command-line标签的原因是什么?您需要在哪里'export'?请详细说明!
  • 这些环境变量需要在什么上下文中可见?如果它们只需要在调用setenv 的程序中可见,就可以了。如果您在运行程序后需要它们在 在您的 shell 中可见,请这样说;有(间接)方法可以做到这一点,但除非你问,否则我不会回答这个问题。
  • “导出”是一个 shell 功能setenv() 始终“导出”environ/envp,除非分叉的孩子传递了自定义的envp,即execle()

标签: c++ command-line setenv


【解决方案1】:

来自setenv() 手动输入:

概要

#include <stdlib.h>  
int setenv(const char *envname, const char *envval, int overwrite);

描述
setenv() 函数应在调用进程的环境中更新或添加变量。 envname 参数指向一个包含环境变量名称的字符串 被添加或更改。环境变量应设置为 envval 指向的值。如果 envname 指向包含“=”字符的字符串,则该函数将失败。如果 以 envname 命名的环境变量已经存在且 overwrite 的值非零,函数应返回成功并更新环境。如果环境 envname 命名的变量已经存在,overwrite 的值为零,函数返回成功,环境保持不变。

如果应用程序修改了 environ 或其指向的指针,则 setenv() 的行为未定义。 setenv() 函数将更新指向哪个环境的指针列表 点。

由 envname 和 envval 描述的字符串被这个函数复制。

setenv() 函数不需要是可重入的。不需要可重入的函数不需要是线程安全的。

返回值
成功完成后,归零。否则返回-1,设置errno表示错误,环境不变。

所以你应该打电话给

setenv("ROS_HOSTNAME","xxx",1); // does overwrite

setenv("ROS_HOSTNAME","xxx",0); // does not overwrite

针对您的情况。取决于,如果你想覆盖一个可能存在的定义。

注意:

您不能使用setenv() 将变量从您的进程导出到调用进程(shell)! 使用 fork 创建的子进程将继承当前进程环境定义,因此您的更改和添加也将继承。

【讨论】:

    【解决方案2】:

    这里是 setenv 函数的签名

    #include <stdlib.h>
    

    int setenv(const char *envname, const char *envval, int overwrite);

    链接:http://pubs.opengroup.org/onlinepubs/009695399/functions/setenv.html

    在你的情况下,你这样称呼它:

    setenv("ROS_HOSTNAME", "xxx", true);
    

    最后一个布尔参数表示如果环境变量的值已经存在,是否要覆盖它。

    【讨论】:

      【解决方案3】:

      这样做

      setenv("ROS_HOSTNAME", "xxx", true);
      

      请注意它的概要:

      #include <stdlib.h>
      
      int setenv(const char *envname, const char *envval, int overwrite);
      

      有关setenv() 的更多详细信息,请参阅this link

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-02-22
        • 2020-01-03
        • 1970-01-01
        • 2016-09-19
        • 2011-01-31
        • 1970-01-01
        • 2017-07-27
        相关资源
        最近更新 更多