getenv, getenv_s

来自cppreference.com
< c‎ | program
定义于头文件 <stdlib.h>
char *getenv( const char *name );
(1)
errno_t getenv_s( size_t *restrict len, char *restrict value,
                  rsize_t valuesz, const char *restrict name );
(2) (C11 起)
1) 在宿主指定的环境列表中,查找名为 name 的环境变量,并返回关联到匹配环境变量的字符串。环境变量的集合及修改它的方法是实现定义的。
此函数不保证是线程安全的。对于另一个对 getenv 的调用,和对 POSIX 函数 setenv()unsetenv()putenv() 的调用一样,可能会使先前的调用返回的指针非法,或者修改先前调用所得的字符串。
修改 getenv 返回的字符串会引起未定义行为。
2)(1) ,除了将环境变量的值写入用户提供的缓冲区 value (除非它为 NULL ),而且将写入的字节数存储于用户提供的位置 *len (除非它为 NULL )。若环境变量未设置于环境中,则*len会被写入零(除非是NULL),且'\0'会被写入value[0](除非是NULL)。另外,在运行时检测下列错误,并调用当前安装的制约处理函数:
  • name 是空指针
  • valuesz 大于 RSIZE_MAX
  • value 是空指针且 valuesz 非零
同所有边界检查函数, getenv_s 仅若实现定义了 __STDC_LIB_EXT1__ ,且用户在包含 stdlib.h 前定义 __STDC_WANT_LIB_EXT1__ 为整数常量 1 才保证可用。

参数

name - 标识要查找的环境变量名称的空终止字符串
len - 指向用户提供的位置, getenv_s 将会在其中存储环境变量的长度
value - 指向用户提供的字符数组, getenv_s 将会在其中存储环境变量内容
valuesz - 允许 getenv_s 对目标写入的最大字节数(缓冲区大小)

返回值

1) 标识环境变量的值的字符串,若找不到该环境变量则为空指针。
2) 若找到环境变量则为零,若找不到该环境变量或发生运行时强制违规,则为非零。错误的情况下,将 *len 写入零(除非 len 为空指针)。

注意

POSIX 系统上,环境变量亦可通过全局变量 environ 访问,它于 <unistd.h> 中声明为 extern char **environ; ,并可通过可选的 main 函数第三参数 envp 访问。

以空指针为 value ,以零为 valuesz 调用 getenv_s ,可用于确定保有整个结果所需的缓冲区大小。

示例

#include <stdio.h>
#include <stdlib.h>
 
int main(void)
{
    char *env_p = getenv("PATH");
    if (env_p)
        printf("PATH = %s\n", env_p);
}

可能的输出:

PATH = /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

引用

  • C11 standard (ISO/IEC 9899:2011):
  • 7.22.4.6 The getenv function (p: 352-353)
  • K.3.6.2.1 The getenv_s function (p: 606-607)
  • C99 standard (ISO/IEC 9899:1999):
  • 7.20.4.5 The getenv function (p: 317)
  • C89/C90 standard (ISO/IEC 9899:1990):
  • 4.10.4.4 The getenv function

参阅