如何检查是否从C程序设置了环境变量

时间:2015-01-17 21:37:02

标签: c unix environment-variables

我目前正在开发一个程序,如果设置了环境变量,我想打印特殊输出。

例如,假设我想要环境变量"DEBUG"

在我的bash命令提示符下,我通过输入命令设置DEBUGDEBUG=

然后在我的C程序中,我可以通过打印char **environ的所有内容来验证是否设置了此环境变量。 DEBUG确实会在此环境中打印出来。

但是,我不知道如何检索此环境变量以进行条件检查。我尝试过使用getenv这样的功能:

getenv("DEBUG")

如果我试图像下面那样打印出这个输出,我会遇到一个段错误:

printf("get env: %s\n", getenv("DEBUG"));

我甚至在"HOME"之类的已知环境变量上试过这个:

printf("get env: %s\n", getenv("HOME"));

仍会产生seg故障。

是否有任何人有经验检查是否从C程序设置了环境变量?我甚至在提取单个环境变量时遇到了问题,这阻碍了我这样做。

4 个答案:

答案 0 :(得分:4)

getenv在未设置要求的环境变量时返回NULL。因此,您的支票可能只是

if(getenv("DEBUG")) {
  // DEBUG is set
} else {
  // DEBUG is not set
}

请注意,shell和环境变量之间存在差异;如果你想让一个变量显示在shell的子进程的环境中,你必须在shell中export

export DEBUG=some_value

DEBUG=some_value
export DEBUG

仅仅说DEBUG=some_value是不够的。

答案 1 :(得分:3)

您需要确保getenv(和printf)被正确声明。

对于getenv,您需要:

#include <stdlib.h>

如果您没有声明它,可能会在您调用时出现段错误。如果你要做到这一点,尝试使用它返回的值可能也会出现段错误。

处理未声明的函数就好像它们被声明为接受整数或双参数(取决于提供的内容)并且好像它们返回整数一样。如果int与指针的大小相同,那可能会有效,但在指针为64位但int只有32的常见情况下,将指针作为整数传递将导致其位数的一半被丢弃在地板上,使它几乎无法用作指针。

在编译代码时始终指定-Wall,并确保注意警告。它们很重要。

答案 2 :(得分:2)

这是因为您没有包含stdlib.h,并且编译器假设getenv()返回int

您有两种选择,您可以声明getenv()喜欢

char *getenv(const char *);

或包含stdlib.h,同样适用于printf(),但在这种情况下,标题为stdio.h

您应该在Linux gccclang上启用编译器警告,支持-Wall -Wextra -Werror,最重要的一个,-Werror将阻止此情况下的编译。

答案 3 :(得分:0)

代码段:

   if(NULL == getenv("TIME_ELAPSED"))
    {
        putenv("TIME_ELAPSED=1");
    }

我们还要为putenv处理错误处理。有时它会返回 ENOMEM空间不足以分配新环境。