当前位置: 代码迷 >> 综合 >> linux C编程2-环境变量
  详细解决方案

linux C编程2-环境变量

热度:81   发布时间:2023-11-30 09:46:25.0

目录

1、环境变量和自定义变量

2、export/set/env/declare 的区别

3、shell环境变量

3.1、env命令

3.2、printenv

3.3、添加环境变量

3.4、删除环境变量

3.5、添加自定义变量

3.6、删除自定义变量

3.7、常用环境变量

4、进程环境变量

4.1、向进程环境变量表中添加环境变量

4.2、environ 变量

4.3、getenv函数

4.4、putenv函数

4.5、setenv函数

4.6、unsetenv函数

4.7、清空环境变量

4.7.1、使用全局变量 environ

4.7.2、clearenv函数


1、环境变量和自定义变量

区别在于作用范围不同。环境变量是全局的,而自定义变量的势力范围仅限于自身进程。

2、export/set/env/declare 的区别

env 显示当前用户的环境变量,但不会显示其自定义变量
export 显示当前用户的环境变量,但不会显示其自定义变量,该命令的输出是按变量名进行排序。
set 显示当前 Shell 中定义的所有变量,包括用户的环境变量和自定义变量
declare 显示当前 Shell 中定义的所有变量,包括用户的环境变量和自定义变量,该命令的输出按变量名进行排序

3、shell环境变量

3.1、env命令

打印当前系统环境变量。

3.2、printenv

1)printenv : 显示系统所有环境变量;

2)printenv 环境变量名 : 显示某个环境变量值;

注:printenv不加参数时和env一样,但printenv可以打印指定名称的环境变量。

3.3、添加环境变量

export 变量=值

3.4、删除环境变量

export -n 变量

3.5、添加自定义变量

变量=值

3.6、删除自定义变量

unset 变量

3.7、常用环境变量

变量 说明
HOME 当前用户主目录
USER 当前用户
BASH Bash Shell的全路径
BASH_VERSION Bash Shell的版本号
EUID 记录当前用户的UID
HOSTNAME 主机名
HOSTTYPE 主机架构
MACHTYPE 机器类型的GNU标识
PWD 当前目录
OLDPWD 之前的目录
PATH 命令的搜索路径
LD_LIBRARY_PATH 程序加载运行期间查找动态链接库的路径
LIBRARY_PATH 程序编译期间查找动态链接库时的路径

4、进程环境变量

每一个进程都有一组与其相关的环境变量, 这些环境变量以字符串形式存储在一个字符串数组列表中,把这个数组称为环境列表。

进程的环境变量是从其父进程中继承过来的,譬如在 shell 终端下执行一个应用程序,那么该进程的环境变量就是从其父进程(shell 进程)中继承过来的。新的进程在创建之前,会继承其父进程的环境变量副本。
 

4.1、向进程环境变量表中添加环境变量

在执行程序的时候,在其路径前面添加环境变量,以 name=value 的形式添加,如果是多个环境变量,则在./app 前面放置多对 name=value 即可,以空格分隔。

变量1=值1 变量2=值2 ... 应用程序 参数1 参数2 ...

4.2、environ 变量

进程环境变量存放在一个字符串数组中,在应用程序中,通过 environ 变量指向它, environ 是一个全局变量,在应用程序中只需申明即可使用,如下所示:

extern char **environ;

4.3、getenv函数

在应用程序中获取某个指定的环境变量。

#include <stdlib.h>char *getenv(const char *name);

参数 name: 指定获取的环境变量名称。
返回值: 如果存在该环境变量,则返回该环境变量的值对应字符串的指针;如果不存在该环境变量,则返回 NULL。

4.4、putenv函数

putenv()函数可向进程的环境变量数组中添加一个新的环境变量,或者修改一个已经存在的环境变量。

#include <stdlib.h>int putenv(char *string);

参数 string: 参数 string 是一个字符串指针,指向 name=value 形式的字符串。
返回值: 成功返回 0;失败将返回非 0 值,并设置 errno。

注:putenv()函数将设定 environ 变量(字符串数组)中的某个元素(字符串指针)指向该 string 字符串,而不是指向它的复制副本!因此,不能随意修改参数 string 所指向的内容,这将影响进程的环境变量,出于这种原因,参数 string 不应为自动变量(即在栈中分配的字符数组) 。

4.5、setenv函数

setenv()函数可以替代 putenv()函数,用于向进程的环境变量列表中添加一个新的环境变量或修改现有环境变量对应的值。

注:setenv()函数为形如 name=value 的字符串分配一块内存缓冲区,并将参数 name 和参数 value 所指向的字符串复制到此缓冲区中,以此来创建一个新的环境变量。

#include <stdlib.h>int setenv(const char *name, const char *value, int overwrite);

参数 name: 需要添加或修改的环境变量名称。
参数 value: 环境变量的值。
参数 overwrite: 若参数 name 标识的环境变量已经存在在参数 overwrite 为 0 的情况下, setenv()函数将不改变现有环境变量的值,也就是说本次调用没有产生任何影响如果参数 overwrite 的值为非 0,若参数 name标识的环境变量已经存在,则覆盖。不存在则表示添加新的环境变量。
返回值: 成功返回 0;失败将返回-1,并设置 errno。

4.6、unsetenv函数

unsetenv()函数可以从环境变量表中移除参数 name 标识的环境变量。

#include <stdlib.h>int unsetenv(const char *name);

参数 name: 需要移除的环境变量名称。

返回值: 成功返回 0;失败将返回-1,并设置 errno。

4.7、清空环境变量

4.7.1、使用全局变量 environ

可以通过将全局变量 environ 赋值为 NULL来清空所有变量。

environ = NULL;

4.7.2、clearenv函数

#include <stdlib.h>int clearenv(void);

返回值: 成功返回 0;失败返回非0;

注:在某些情况下,使用setenv()函数和clearenv()函数可能会导致程序内存泄漏, setenv()函数会为环境变量分配一块内存缓冲区,随之称为进程的一部分;而调用 clearenv()函数时没有释放该缓冲区(clearenv()调用并不知晓该缓冲区的存在,故而也无法将其释放),反复调用者两个函数的程序,会不断产生内存泄漏。