上篇文章:Linux基础4-进程3(进程优先级,竞争,独立,并行,并发,进程切换)-CSDN博客
本章重点: Linux中环境变量的理解和使用
目录
一. 环境变量概念和查看环境变量
1.1 环境变量概念
1.2 查看环境变量
二. 获取环境变量
2.1 getenv
2.1.1 USER环境变量
2.1.2 PWD环境变量
2.2 通过第三方变量 environ
三. 命令行参数获取环境变量
3.1 argc和argv
3.2 env
四. 下章重点:程序地址空间
一. 环境变量概念和查看环境变量
1.1 环境变量概念
环境变量一般指的是在操作系统中用来指定操作系统运行环境的一些参数。
比如在Linux中,ls,pwd,cd 这些命令可以直接运行。而我们自己写的可执行程序需要./程序名才能执行(即我们要找到这个程序的路径)。
要执行一个程序,我们首先需要找到它(系统命令由于有环境变量,这些由操作系统指定的参数会在系统启动的时候就被自动运行,环境变量帮助系统命令查找进程所在路径,所以能够直接运行)而我们的命令没有环境变量帮助查找,所以不能直接运行
常见的环境变量有:
PATH:PATH是指定命令的搜索路径,在这个环境变量中的命令可以直接运行(入ls,pwd)
HOME:记录登入用户的家目录,登入系统的时候会通过HOME进入。
SHELL :当前的shell程序
1.2 查看环境变量
env 查看系统的所有环境变量
echo $环境变量名 可以查看具体的环境变量
set 可以查看本地自定义的环境变量和shell变量
export 可以设置一个环境变量,设置的环境变量仅当前有效,用户退出后会消失
unport 取消设置一个环境变量
二. 测试环境变量PATH
使用echo查看PATH,在上面路径的程序都可以直接运行
我们自己创建一个可执行程序,如何不用带路径就能执行??
1 在PATH命令中添加该可执行程序的路径即可
我们使用export将hello放到PATH中
2 将可执行程序放到PATH中的某一个系统默认路径中
二. 获取环境变量
2.1 getenv
getenv是C语言中的一个函数,可以获取环境变量
#include <stdlib.h> //包含在这个头文件中char *getenv(const char *name);
//返回值是name环境变量所指的值
测试代码:
2.1.1 USER环境变量
#include <stdio.h>
#include <stdlib.h>int main()
{printf("%s\n", getenv("USER"));return 0;
}
运行结果,在普通用户中输出其用户名,在root中输出root
这说明了USER这个环境变量的意义:可以唯一标识当前使用Linux的用户
比如我们可以通过USER来确定某人是否有权限
#include <stdio.h>
#include <stdlib.h>
#include <string.h>int main()
{const char *who = getenv("USER");if(strcmp(who,"root") == 0){printf("%s!\n", who);}else {printf("权限不足\n");}return 0;
}
运行结果,由于我是YZC,不是root。会显示权限不足
2.1.2 PWD环境变量
系统是如何知道我们在哪一个路径??
系统通过PWD这个环境变量来维护当前路径,当我们切换目录的时候,shell会修改PWD
所以我们可以直接 ls test.c 而不需要 ls ./test.c 因为PWD会帮助ls进行
我们知道pwd命令可以显示当前路径,我们通过PWD环境变量也可以编写一个C程序来显示当前路径
代码如下:
#include <stdio.h>
#include <stdlib.h>int main()
{printf("%s\n", getenv("PWD"));return 0;
}
如果把这个指令放到 /bin/user中 就能够相当于我们写了一个pwd指令
2.2 通过第三方变量 environ
使用environ的时候需要 extern char** environ
**的原因:environ指向的是整个环境变量表,这个表中的每一个环境变量又指向相应的路径
#include <stdio.h>
#include <stdlib.h>int main()
{extern char**environ;int i = 0;for( ; environ[i]; i++){printf("%s\n", environ[i]);}return 0;
}
运行结果如下:
我们通过 if 判断就能够使用相应的环境变量
三. 命令行参数获取环境变量
命令行有三个参数
int main(int argc, char *argv[], char *env[])
{}
其中, argv和env都是指针数组
3.1 argc和argv
我们知道,在linux中输入部分命令的时候我们可以带上参数,如:
ls -a -l -i
其中 argc就代表了参数的个数,agrv[]这个指针数组指向参数解析后的子串(即一张映射表)
如下列代码:
#include <stdio.h>
#include <stdlib.h>int main(int argc, char *argv[])
{for(int i = 0; i < argc; i++){printf("argv[%d] -> %s\n", i, argv[i]);}return 0;
}
通过argc和argv我们可以实现,带入不同的参数执行不同的功能
3.2 env
env为第三个命令行参数,这个参数是存放环境变量的指针数组,我们可以通过env获取环境变量
#include <stdio.h>
#include <stdlib.h>int main(int argc, char *argv[], char *env[])
{for(int i = 0; env[i]; i++)//由于环境变量最后为NULL,所以用env[i]即可控制循环{printf("env[%d] -> %s\n", i, env[i]);}return 0;
}
运行结果如下,可以获取环境变量