For the complete documentation index, see llms.txt. This page is also available as Markdown.

getenv(3)

getenv, clearenv, getenv_r, putenv, secure_getenv, setenv, unsetenv — 环境变量函数

名称

clearenv, getenv, getenv_r, putenv, secure_getenv, setenv, unsetenv

Lb libc

概要

#include <stdlib.h>

int
clearenv(void);

char *
getenv(const char *name);

int
getenv_r(const char *name, char *buf, size_t len);

char *
secure_getenv(const char *name);

int
setenv(const char *name, const char *value, int overwrite);

int
putenv(char *string);

int
unsetenv(const char *name);

描述

这些函数用于设置、删除和获取宿主环境列表中的环境变量。

clearenv 函数清除所有环境变量。可以使用 setenvputenv 添加新变量。

getenv 函数获取由 name 指定的环境变量的当前值。应用程序不应修改 getenv 函数所返回字符串指向的内容。

getenv_r 函数获取由 name 指定的环境变量的当前值,并将其复制到长度为 len 的缓冲区 buf 中。

secure_getenv 在环境不可信时返回 NULL,否则其行为与 getenv 相同。当前,当 issetugid(2) 返回非零值时环境不可信,但未来可能添加其他条件。

setenv 函数在当前环境列表中插入或重置环境变量 name。若列表中不存在变量 name,则将其与给定 value 一起插入。若变量已存在,则测试 overwrite 参数;若 overwrite 为零,则不重置该变量,否则将其重置为给定 value

putenv 函数接受一个 name=value 形式的参数,并将其直接放入当前环境中,因此修改该参数将改变环境。若列表中不存在变量 name,则将其与给定 value 一起插入。若变量 name 已存在,则将其重置为给定 value

unsetenv 函数从列表中删除 name 所指变量名的所有实例。

若在为内部使用而复制 environ 时检测到损坏(例如没有值的名称),则 setenvunsetenvputenv 将向 stderr 输出有关该问题的警告,丢弃损坏的条目并完成任务而不报错。

返回值

getenv 函数以 NUL 结尾字符串的形式返回环境变量的值。若变量 name 不在当前环境中,则返回 NULL

secure_getenv 函数在进程处于"安全执行"状态时返回 NULL,否则调用 getenv

成功完成时,clearenvgetenv_rsetenvputenvunsetenv 函数返回 0。否则返回 -1,并设置 errno 以指示错误。

错误

[EINVAL] getenvgetenv_rsetenvunsetenv 函数失败,因为 nameNULL 指针、指向空字符串,或指向包含 = 字符的字符串。putenv 函数失败,因为 stringNULL 指针、string 不含 = 字符,或 =string 中的第一个字符。这不遵循 POSIX 规范。

[ENOENT] getenv_r 函数失败,因为在环境中未找到所请求的变量。

[ENOMEM] setenvunsetenvputenv 函数失败,因为无法为环境分配内存。

[ERANGE] getenv_r 函数失败,因为所请求变量的值过长,无法放入提供的缓冲区。

参见

csh(1), sh(1), execve(2), environ(7)

标准

getenv 函数遵循 ISO/IEC 9899:1990 ("ISO C89")。setenvputenvunsetenv 函数遵循 IEEE Std 1003.1-2001 ("POSIX.1")。secure_getenv 函数遵循 -p1003.1-2024。

历史

setenvunsetenv 函数首次出现于 Version 7 AT&T UNIX。putenv 函数首次出现于 4.3BSD。

在 FreeBSD 7.0 之前,putenv 会复制 string 并使用 setenv 将其插入环境。此后改为将 string 用作 name=value 对的内存位置,以遵循 POSIX 规范。

clearenvsecure_getenv 函数添加于 FreeBSD 14。

getenv_r 函数首次出现于 NetBSD 4.0,并添加于 FreeBSD 15。

缺陷

连续调用 setenv 为同一 name 赋予比之前任何值都大的 value 将导致内存泄漏。FreeBSD 中此函数的语义(即 value 的内容被复制,且旧值无限期保持可访问)使得该缺陷无法避免。未来版本可能取消这两条语义保证中的一条或全部以修复此缺陷。

最后更新于

这有帮助吗?