环境变量与虚拟地址空间
环境变量与虚拟地址空间
环境变量
(1)问题引入
你在xshell里写了一个程序,程序名字叫做code.c
// An highlighted block
#include <iostream>
int main()
{
int x;
cin>>x;
cout<<x;
return 0;
}
好,现在你建立了一个makefile文件,内容是
code:code.c
gcc -o $@ $^
.PHONY:clean
clean:
rm -f code
在make一下,如果你想编译一下,需要输入
./code
但是平时我们用的系统命令ls,which man,tree之类的不用带路径,而自己的程序则需要带路径(,/是指当前路径普通文件)
系统会去/usr/bin路径取找,如果你
sudo cp code /usr/bin
那你就能直接code运行
当然,不要乱往/usr/bin里面乱放文件,搞完之后一定要
// An highlighted blocksudo
rm /usr/bin/code
linux是不会在当前路径找文件的,./是告诉os用户执行的bin,就在当前路径下
问题:linux还会不会取其他路径查找呢?
结论:linux系统会存在所谓的环境变量的东西,PATH
echo PATH//这样写只会打印PATH
echo $PATH//这里的$有点像c语言中的指针,打印多串路径
echo $PATH告诉linux系统,用户如果执行一个可执行文件,没有指明路径,到PATH指定路径查找
所以还可以把code.c所在的文件路径加入到PATH中,这样也可以不用带路径
pwd
PATH=(pwd的内容)//覆盖
但其他的有些指令无法执行了(关闭xshell就可以了,不用重新配置)
pwd
PATH=$PATH:(pwd的内容)//添加
PATH:指定命令的搜索路径
当然,windows也有环境变量这个概念,如果你把某个程序放到PATH下,你在cmd打开的输入名称的话就可以打开,所以windows配置环境,其实就是避免了一定要在对应路径的情况下才能打开,在命令行可以打开
(2)引入环境变量
系统级的变量,变量名和变量内容,往往具有全局属性(在任意路径都可以访问)、
想查看当前xshell的机器属性,可以输入env
其中,HISTSIZE是linux会帮你储存最近的1000条消息,为什么是1000条就是因为HISTSIEZ是1000
cd -切换最近的路径其实就是cd $oldpwd
这个呢,则是记录当前在哪个终端,因为xshell支持在多个终端登录,可以互相运输文件,通过这个就可以查看当前是哪个终端
例如:
echo aaa > /dev/pts/0
就可以往这个终端打印aaa
cd ~回到家目录,本质是
cd $HOME
SHELL :当前的shell,通常是/bin/bash
(3)环境变量和c++代码关系
1.用代码获取环境变量
#inclued <iostream>
int main(int argc,char *argv[],char *env[])
{
(void)argc;//如果argc和argv写了但是不用打话,最好强转化为void类型
(void)argv;
int i=0;
for(;env[i];i++)
{
printf(":env[%d]:%s\n",i,env[i]);//env[i]最后一个也是NULL
}
return 0;
}
当然,如果不想再main函数中写入参数,可以写成(不常用)
#inclued <iostream>
#include <unistd.h>
int main()
{
extern char **environ;//声明,不然可以显示无法识别
int i=0;
for(;environ[i];i++)
{
printf(":environ[%d]:%s\n",i,environ[i]);
}
return 0;
}
拿到系统的环境变量表,本质是把环境变量表传递给进程,默认是在bash内部的,虽然子进程(你创建的进程)没有收到bash给的环境变量,但是默认子进程就可以获得bash(父进程)内的命令行参数和环境变量

最常见获取常见变量的是
char *getenv(const char *name);//头文件#include <stdlib.h>
2.作用
不同的环境变量,会有不同的应用场景,可以对应设置
环境变量是父进程给的,可以理解为继承过来的
当我内部在fork一下的时候,我创建的子进程也可以看到env[];所以环境变量有全局性
bash进程的环境变量,又是从linux系统的配置环境来的(配置文件)
如果想更改,可以打开bashrc进行修改

当然,你修改这个文件的时候只修改这个用户的,别的用户不会被修改
(4)添加环境变量
假设你要定义一个TEST_ENV对象,如果你直接
TEST_ENV 123456789(本地变量,无法被子进程继承,不具备全局性,在能在bash内部访问)
然后env | grep TEST_ENV是无法找到的
想要加入这个变量到环境变量中
例子1:例子1:TEST_ENV 123456789
export $TEST_ENV(export把本地变量写入到环境变量)
例子2:export aaaaa=6666
(5)删除环境变量
例子1:unset TEST_ENV
例子2:unset aaaaa
unset+环境变量名
作用:取消环境变量
注:echo env unset均是内存级别的,重新打开xshell后就消失了
(6)set
储存环境变量和本地变量
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐


所有评论(0)