Linux环境变量
1、什么是环境变量
环境变量(environment variables)一般是指在操作系统中用来指定操作系统运行环境的一些参数,如:临时文件夹位置、系统文件夹位置等。
环境变量是在操作系统中一个具有特定名字的对象,它包含了一个或者多个应用程序所将使用到的信息。例如操作系统中的path环境变量【配过Windows环境变量对path应该很熟悉了】,当要求系统运行一个程序而没有告诉它程序所在的完整路径时,系统除了在当前目录下面寻找此程序外,还应到path中指定的路径去找。用户通过设置环境变量,来更好的运行程序。
2、环境变量的主要作用:
设置程序的运行参数:
环境变量相当于给系统或用户给应用程序设置的一些参数,具体起什么作用这当然和具体的环境变量相关,例如一个程序在运行时默认该使用什么语言,界面的大小,日志文件存储在什么位置,临时文件存储在什么位置,都需要通过查询操作系统的环境变量才能确定。
程序共用:
当软件A需要使用到软件B中部分功能时,但无论是操作系统还是软件A、B的作者都无法控制软件安装在什么位置,这时就可以让软件B设置环境变量告诉操作系统它安装在了哪个位置,而软件A就可以通过查询环境变量知道软件B安装在什么地方,从而调用软件B的功能。
系统运行:
用户还可以通过设置环境变量告诉操作系统一些运行参数,如设置当前系统的语言、字符编码、终端的默认大小等。
常见的环境变量:
PS1 # 命令提示符
PATH # 命令的搜索路径
C_INCLUDE_PATH # 头文件的搜索路径
LIBRARY_PATH # 编译时,连接库文件的搜索路径
LD_LIBRARY_PATH # 程序执行时动态库的搜索路径
3、设置环境变量:
查看环境变量:
1、Linux系统使用env命令查看环境变量
2、Windows系统使用set命令查看环境变量
3、在程序中查看
#include <stdio.h>
// 程序在运行时父进程都会通过main函数参数传递一份环境变量表的拷贝,是一个以NULL指针结尾的字符指针数组。
int main(int argc,const char* argv[],char* environ[])
{
for(int i=0; environ[i]; i++)
{
printf("%s\n",environ[i]);
}
}
通过修改配置文件设置:
1、Linux系统的修改方法
# 打开配置文件:
vi ~/.bashrc # 只对当前用户用效
vi /etc/environment # 对所有用户有效 编辑需要管理员权限
# 在文件末尾添加内容:
export C_INCLUDE_PATH=<环境变量的内容>
C_INCLUDE_PATH=$C_INCLUDE_PATH:<追加新的内容>
# 需要重新加载配置文件:
source ~/.bashrc
2、Windows系统的修改方法
使用标准库函数设置环境变量:
环境变量和格式:name=value
// 根据name获得value
char *getenv(const char *name);
// 以name=value的形式设置环境变量,name不存在就添加,存在就覆盖其value
int putenv(char *string);
// 根据name设置value,注意最后一个参数表示,若name已不存在则添加,如果name已经存在是否覆盖其value由overwrite控制
// If name does exist in the environment, then its value is changed to value if overwrite is nonzero; if overwrite is zero, then the value of name is not changed。非0更改
int setenv(const char *name, const char *value, int overwrite);
// 删除环境变量。
int unsetenv(const char *name);
// 清空环境变量,environ==NULL。
int clearenv(void);
注意:由于当前程序获得是环境变量表的拷贝(副本), 因此在当前程序中对环境变量表进行增、删、改不会影响其它程序和操作系统,而修改后环境变量表会传给它的子进程,也就是会对子进程造成影响。
4、错误处理
(1)通过函数的返回值表示错误:
例如main函数:0成功,1异常,-1错误
还有自定义函数
(2)通过errno表示错误:
errno 是记录系统的最后一次错误代码。代码是一个int型的值,在errno.h中定义。查看错误代码errno是调试程序的一个重要方法。
当调用Linux系统API函数发生异常时,一般会将errno变量赋一个整数值,不同的值表示不同的含义,可以通过查看该值推测出错的原因,在实际编程中用这一招能解决不少原本看来莫名其妙的问题。
errno在函数执行成功的情况下不会被修改,因此不能以errno非零,作为发生错误判断依据, errno是一个全局变量,其值随时可能发生变化,所以要配合函数的返回值来使用errno。
#include <stdio.h>
#include <errno.h>
int main ()
{
FILE* fp = fopen ("none", "r");
if (NULL == fp)
{
// 查看错误编号
printf ("fopen: %d\n", errno);
// 根据错误编号查看错误提示
printf ("fopen: %s\n", strerror (errno));
// 自动根据错误编号查看错误提示
printf ("fopen: %m\n");
// 自动根据错误编号查看错误提示
perror ("fopen");
return -1;
}
fclose (fp);
return 0;
}
/*
fopen: 2
fopen: No such file or directory
fopen: No such file or directory
fopen: No such file or directory
*/
注意:使用系统API(系统函数)的返回值来判断函数执行是否出错,使用errno机制来获取错误原理