我目前正在开发一个程序,如果设置了环境变量,我想打印特殊输出。
例如,假设我想要环境变量"DEBUG"
。
在我的bash命令提示符下,我通过输入命令设置DEBUG
:
DEBUG=
然后在我的C程序中,我可以通过打印char **environ
的所有内容来验证是否设置了此环境变量。 DEBUG
确实会在此环境中打印出来。
但是,我不知道如何检索此环境变量以进行条件检查。我尝试过使用getenv这样的功能:
getenv("DEBUG")
如果我试图像下面那样打印出这个输出,我会遇到一个段错误:
printf("get env: %s\n", getenv("DEBUG"));
我甚至在"HOME"
之类的已知环境变量上试过这个:
printf("get env: %s\n", getenv("HOME"));
仍会产生seg故障。
是否有任何人有经验检查是否从C程序设置了环境变量?我甚至在提取单个环境变量时遇到了问题,这阻碍了我这样做。
答案 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 gcc
和clang
上启用编译器警告,支持-Wall -Wextra -Werror
,最重要的一个,-Werror
将阻止此情况下的编译。
答案 3 :(得分:0)
代码段:
if(NULL == getenv("TIME_ELAPSED"))
{
putenv("TIME_ELAPSED=1");
}
我们还要为putenv处理错误处理。有时它会返回 ENOMEM空间不足以分配新环境。