Linux应用编程 | 环境变量相关

环境变量
环境变量,是指在操作系统中用来指定操作系统运行环境的一些参数。比如说,用户登录到系统后,他的家目录是什么?默认文本编辑器是什么?默认shell程序是什么?类似这样的信息就称为环境变量。环境变量通常具备以下特征:
① 以字符串形式存储;
② 以健值对格式存储:健=值[:值] (同一个健有多个值的话,值与值之间以:相隔)
③ 值用来描述进程环境信息。
存储形式:char *[]数组,数组名environ,内部存储字符串,以NULL结尾。
加载位置:位于用户区,高于stack的起始位置。
引入环境变量表:须声明环境变量。extern char ** environ;           
查看本机的环境变量:使用命令env
编程打印本机所有环境变量:
#include <stdio.h>

/* environ本质是{"HOME=/home/alvin", "SHELL=/bin/bash", ...} */
extern char **environ;

int main()
{
    int i = 0;

    for (i = 0; environ[i] != NULL; i++)
        printf("%s\n", environ[i]);

    return 0;
}



常用环境变量
按照惯例,环境变量字符串都是name=value这样的形式,大多数name由大写字母加下划线组成,一般把name的部分叫做环境变量,value的部分则是环境变量的值。环境变量定义了进程的运行环境,一些比较重要的环境变量的含义如下:
PATH
可执行文件的搜索路径。比如我们在命令行窗口执行ls命令,系统会自动到PATH所指定的目录下寻找该命令所对应的程序,而无需我们显式的指定该命令完整路径/bin/ls。而对于我们自己写的程序,我们通常需要加上完整的路径,比如执行当前目录下的程序a.out,需要执行./a.out,这是因为PATH环境变量的值里面不包含a.out所在的目录。在Shell中查看某个环境变量的值,可以使用echo命令,比如查看PATH的值,可以执行以下命令:
$ echo $PATH
SHELL
当前所使用的Shell,它的值通常是/bin/bash,但不同的linux发行版可能不一样。
TERM
当前终端类型,在图形界面终端下它的值通常是xterm,终端类型决定了一些程序的输出显示方式,比如图形界面终端可以显示汉字,而字符终端一般不行。
LANG
系统默认语言,即系统的菜单、程序的工具栏语言、输入法默认语言等,决定了字符编码以及时间、货币等信息的显示格式。
HOME
当前用户主目录的路径,很多程序需要在主目录下保存配置文件,使得每个用户在运行该程序时都有自己的一套配置。

常用函数
getenv函数
函数说明:获取环境变量值
函数原型:char *getenv(const char *name);
函数返回值:成功:返回环境变量的值;失败:NULL (name不存在)
练习:编程实现getenv函数。
#include <stdio.h>
#include <stdlib.h>

extern char **environ;

int main(int argc, char **argv)
{
    char *p = NULL;

    if (argc != 2) {
        printf("usage: ./getenv name\n");
        return -1;
    }

    p = getenv(argv[1]);
    if (p == NULL)
        printf("no match!\n");
    else
        printf("%s\n", p);

    return 0;
}

setenv函数
函数说明:设置环境变量的值        
函数原型:int setenv(const char *name, const char *value, int overwrite); 
参数overwrite取值:
1:覆盖原环境变量
0:不覆盖。(该参数常用于设置新环境变量,如:ABC = haha-day-night)
返回值:成功:0;失败:-1


unsetenv函数
函数说明:删除环境变量name的定义
函数原型:int unsetenv(const char *name);
返回值:成功:0;失败:-1
注意事项:name不存在仍返回0(成功),当name命名为"ABC="时则会出错。

#include <stdio.h>
#include <stdlib.h>

int main()
{
    const char *name = "ABC";
    char *val = NULL;

    val = getenv(name);
    printf("1. %s = %s\n", name, val == NULL?"NULL":val);

    setenv(name, "hello", 1);
    val = getenv(name);
    printf("2. %s = %s\n", name, val == NULL?"NULL":val);

#if 0
    int ret = unsetenv("ABC");
#else
    int ret = unsetenv("ABC=");
#endif
    printf("ret = %d\n", ret);
    val = getenv(name);
    printf("3. %s = %s\n", name, val == NULL?"NULL":val);

    return 0;
}

作者介绍
本人是一名Linux应用开发工程师,目前供职于一家世界500强公司,主要负责车联网产品的研发。喜交天下好友,欢迎关注本人公众号一起学习、交流!

猜你喜欢

转载自blog.csdn.net/yychuyu/article/details/80157697