(1)环境变量的定义
环境变量,是指在操作系统中用来指定操作系统运行环境的一些参数(每个用户以及每个进程的环境变量都不一定相同,各自有各自的设置)。通常具备以下特征:字符串(本质);有统一的格式:名=值:值;值用来描述进程环境信息(如目录、文件路径等)。
存储形式:与命令行参数类似(argc和argv)。char *[ ]数组,数组名environ,内部存储字符串,NULL作为哨兵结尾。例如,对于命令行参数,如果argc=4,则argv[4]=NULL,即最后一个为NULL(哨兵),为了防止溢出。这里argv和environ(字符数组名,二维数组名)为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)环境变量相关的函数(getenv、putenv、setenv、unsetenv)
#include <stdlib.h>
char *getenv(const char *name);
作用:用于获取环境变量的值
成功:返回环境变量的值;失败:NULL (name不存在,即name未被定义)
#include <stdlib.h>
int putenv(const char * string);
作用:putenv()用来改变或增加环境变量的内容。参数string的格式为name=value,如果该环境变量原先存在,则变量内容会依参数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