环境变量

1)环境变量的定义

环境变量,是指在操作系统中用来指定操作系统运行环境的一些参数(每个用户以及每个进程的环境变量都不一定相同,各自有各自的设置)。通常具备以下特征:字符串(本质);有统一的格式:名=值:值;值用来描述进程环境信息(如目录、文件路径等)。

存储形式:与命令行参数类似(argc和argv)。char *[ ]数组,数组名environ,内部存储字符串,NULL作为哨兵结尾。例如,对于命令行参数,如果argc=4,则argv[4]=NULL,即最后一个为NULL(哨兵),为了防止溢出。这里argvenviron(字符数组名,二维数组名)为char **类型。

使用形式:与命令行参数类似。

加载位置:与命令行参数类似。位于用户区,高于stack(栈空间)的起始位置。

引入环境变量表:须声明环境变量。extern char ** environ;       注意export与extern的区别:export是在Linux shell终端命令行中,用与将用户个人创建的变量提升为全局变量,则所有用户都可以查看并使用。如 HG=/home/work   export HG

 

// 打印当前进程的所有环境变量

[root@localhost environ]# vim test_environ.c

#include <stdio.h>

extern char **environ;  //引用其它文件已经定义的environ变量

int main(void)
{
    int i;

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

    return 0;
}

[root@localhost environ]# ls

getenv.c  makefile  setenv.c  test  test_environ.c   // test为目录文件

[root@localhost environ]# vim makefile  //对目录内所有的.c文件都进行编译

src = $(wildcard *.c)

targets = $(patsubst %.c, %, $(src))

 

CC = gcc

CFLAGS = -Wall -ggdb3 -pedantic

 

all:$(targets)

 

$(targets):%:%.c

        $(CC) $< -o $@ $(CFLAGS)

 

.PHONY:clean all

clean:

        -rm -rf $(targets)

 

[root@localhost environ]# make

gcc setenv.c -o setenv -Wall -ggdb3 -pedantic

gcc test_environ.c -o test_environ -Wall -ggdb3 -pedantic

gcc getenv.c -o getenv -Wall -ggdb3 -pedantic

[root@localhost environ]# ls

getenv  getenv.c  makefile  setenv  setenv.c  test  test_environ  test_environ.c

[root@localhost environ]# make clean

rm -rf  setenv  test_environ  getenv

 

[root@localhost environ]# ./test_environ

XDG_SESSION_ID=10

HOSTNAME=localhost

SELINUX_ROLE_REQUESTED=

TERM=xterm

········    //中间还有很多

MAIL=/var/spool/mail/root

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

PWD=/mnt/hgfs/share/01_process_test/environ

LANG=en_US.UTF-8

SELINUX_LEVEL_REQUESTED=

HISTCONTROL=ignoredups

 

 

[root@localhost environ]# echo $PATH

/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin

 

上下两个PATH环境变量代表的意义是不一样的,上面的PATH是属于执行./ test_environ 这个进程的环境变量;而下面的PATH是属于shell终端进程的环境变量。

2)常见的环境变量

按照惯例,环境变量字符串都是name=value这样的形式,大多数name由大写字母加下划线组成,一般把name的部分叫做环境变量,value的部分则是环境变量的值。环境变量定义了进程的运行环境,一些比较重要的环境变量的含义如下:

PATH可执行文件的搜索路径。ls命令也是一个程序,执行它不需要提供完整的路径名/bin/ls,然而通常我们执行当前目录下的程序a.out却需要提供完整的路径名./a.out,这是因为PATH环境变量的值里面包含了ls命令所在的目录/bin,却不包含a.out所在的目录。

[root@localhost ~]# date

Sun Mar 24 16:12:31 CST 2019

[root@localhost ~]# which date

/usr/bin/date

[root@localhost ~]# /usr/bin/date   //两个都是执行的是同一个命令

Sun Mar 24 16:12:51 CST 2019

其实在shell终端中执行命令的本质就是执行命令对应的命令文件(date与./a.out一样),命令参数与命令对象就是命令行参数带入进命令文件内部,从而进行控制。

SEHLL当前Shell,它的值通常是/bin/bash。

TERM当前终端类型,在图形界面终端下它的值通常是xterm,终端类型决定了一些程序的输出显示方式,比如图形界面终端可以显示汉字,而字符终端一般不行。

LANG语言和locale,决定了字符编码以及时间、货币等信息的显示格式。

HOME当前用户主目录的路径,很多程序需要在主目录下保存配置文件,使得每个用户在运行该程序时都有自己的一套配置。

3)环境变量相关的函数(getenvputenvsetenvunsetenv

#include <stdlib.h>

char *getenv(const char *name);

作用:用于获取环境变量的值

成功:返回环境变量的值;失败:NULL (name不存在,即name未被定义)

 

#include <stdlib.h>

int putenv(const char * string);

作用:putenv()用来改变或增加环境变量的内容。参数string的格式为namevalue,如果该环境变量原先存在,则变量内容会依参数string改变,否则此参数内容会成为新的环境变量。

返回值:执行成功则返回0,有错误发生则返回-1。

 

#include <stdlib.h>

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

作用:改变环境变量的值,作用同putenv。参数overwrite用来决定是否要改变已存在的环境变量。如果overwrite不为0(覆盖),而该环境变量原已有内容会被改为参数value所指的变量内容。如果overwrite为0,且该环境变量已有内容,则参数value会被忽略;如果环境变量没有内容(即未定义),则会被改为参数value所指的变量内容。

返回值:执行成功则返回0,有错误发生则返回-1。

 

#include <stdlib.h>

int unsetenv(const char *name);

作用:删除环境变量name的定义,使其为NULL(未被定义)。

返回值:执行成功则返回0,有错误发生则返回-1。 注意删除一未被定义的环境变量,返回值依然为0。但是unsetenv(“USER=”)的返回值为-1,其格式不正确(带有=号)。

 

//代码

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

int main(void)
{
        char *val;
        const char *name = "ABD";

        val = getenv(name);
        printf("1, %s = %s\n", name, val);

        setenv(name, "haha-day-and-night", 1);

        val = getenv(name);
        printf("2, %s = %s\n", name, val);

#if 1    //执行它 不执行#else部分  如果为#if 0,则执行else,不执行它
        int ret = unsetenv("ABD=");
        printf("ret = %d\n", ret);   

        val = getenv(name);
        printf("3, %s = %s\n", name, val);

#else
        int ret = unsetenv("ABD");  //name=value:value
        printf("ret = %d\n", ret);

        val = getenv(name);
        printf("3, %s = %s\n", name, val);

#endif

        return 0;
}

[root@localhost environ]# ./setenv

1, ABD = (null)       

2, ABD = haha-day-and-night

ret = -1

3, ABD = haha-day-and-night

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值