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

How to check if environment variable is set from C program

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

例如,假设我想要环境变量"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"));

仍然会产生段错误。

有没有人有检查环境变量是否从 C 程序设置的经验?我什至在提取单个环境变量时遇到问题,这使我无法这样做。

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

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

注意shell和环境变量是有区别的;如果你想让一个变量出现在 shell 的子进程的环境中,你必须 export 它在 shell:

export DEBUG=some_value

DEBUG=some_value
export DEBUG

只说DEBUG=some_value是不够的。

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

对于getenv,您需要:

#include <stdlib.h>

如果不声明,调用时很可能会出现段错误。如果你要走那么远,尝试使用它的值 returns 可能也会出现段错误。

处理未声明的函数时,就好像它们被声明为接受整数或双精度参数(取决于提供的内容),就好像它们 return 整数一样。如果 int 与指针的大小相同,那可能会起作用,但在指针为 64 位而整数仅为 32 位的常见情况下,将指针作为整数传递将导致它的一半位掉在地上,几乎无法用作指针。

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

这是因为您没有包括 stdlib.h 并且编译器假设 getenv() returns int.

你有两个选择,你可以声明getenv()喜欢

char *getenv(const char *);

或包括 stdlib.h,同样适用于 printf(),但在那种情况下 header 是 stdio.h

你应该启用编译器警告,在linux gccclang上都支持-Wall -Wextra -Werror,最重要的是,-Werror会阻止编译这种情况。

代码片段:

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

我们还必须处理 putenv 的错误处理。有时它 returns ENOMEM 不足 space 无法分配新环境。