Linux ----环境变量

进程的相关概念

  • 竞争性:系统进程数目众多,而CPU 资源只有少量,甚至1个,所以进程之间具有竞争属性,为了高效的完成任务,就有了优先级
  • 独立性:进程本身具有独立性,打开如何软件其他软件都不会受影响,需要独享资源,多个进程之间互不干扰
  • 并行多个进程再多个CPU 下分别,同时运行
  • 并发多个进程在一个CPU 下采用切换的方式,在一个时间段,多个进程都得以推进

环境变量

  1 #include<stdio.h>
  2 #include<unistd.h>
  3 int main()
  4 {
  5   int cnt=5;
  6   while(cnt--)
  7   {
  8   ¦// printf("I am a process ,pid %d,ppid %d\n",getpid(),getppid());
  9   ¦ sleep(1);
 10   ¦ printf("I am a cmd -->process\n");
 11                                                                                                                    
 12   }
 13   return 0;
 14 }
~

在这里插入图片描述

这些命令,程序工……本质上都是可执行的文件

那么我们运行的时候,为何要./???

./可以帮助系统确认对应的程序在哪里

那么为什么系统的命令不需要带路径呢?

就是因为有环境变量

常见的环境变量

  • PATH :指定命令的搜索路径

echo $PATH

显示某个环境变量值,在这个环境变量里面的可执行文件就可以直接运行执行

在这里插入图片描述

export

添加设置一个新的环境变量,这样我们自己写的myproc就可以直接运行了
在这里插入图片描述

在这里插入图片描述

将本地变量导成环境变量

  • set

    显示本地定义的shell命令和环境变量

  • unset

    清除环境变量
    在这里插入图片描述

  • HOME

    指定用户的主目录
    在这里插入图片描述

  • env

在这里插入图片描述

显示所有的环境变量

  • echo 显示某个环境变量的值

语言上面定义变量:本质上是在内存中开辟一个空间

环境变量本质上,OS内存/磁盘文件给自己开辟的空间,用来保存系统相关的数据

环境变量

:变量名+变量内容(a,10)

系统上还有一种变量,是与本次登录有关的变量,只在本次登录有效,叫做本地变量

以空格为分隔符,每个都看作字符串,argv[0]=当前目录,程序的名字,最后一个元素指向NULL

argc决定有几个有效的元素

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eduG3KHr-1647503602595)(E:/Typora%E4%BA%91%E7%AC%94%E8%AE%B0%E6%9C%AC/picture/image-20220316130008181.png)]

获得环境变量

 1 #include<stdio.h>
  2 #include<unistd.h>
  3 int main(int argc ,char* argv[],char *env[])//可以获得环境变量的字符串数组,和argv相类似
  4   //argv是一个字符串数组,有argc个变量
  5 {
  6   int j=0;
  7   for(j=0;env[j];j++)//这个是系统自动给我们添加的,所以不带数字的参数
  8   {                                                                                                                                                                                              
  9   ? printf("%s ",env[j]);//因为最后一个数据是NULL
 10   }
 11   int i=0;
 12   for(i=0;i<argc;i++)
 13   {
 14   ? printf("argv[%d]=%s\n",i,argv[i]);
 15   }
 16 //  int cnt=5;
 17 //  while(cnt--)
 18 //  {
 19 //   // printf("I am a process ,pid %d,ppid %d\n",getpid(),getppid());
 20 //    sleep(1);                                                                                                  
 21 //    printf("I am a cmd -->process\n");                 
 22 //                                                                
 23 //  }             
 24   return 0;                                         
 25 } 

函数如果没有参数,可以传参吗

是可以的,只不过获取数据的参数

常见的获得环境变量的方式

getenv(char *name)

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

int main()
{
    printf("PATH: %s ",getenv("PATH"));//获得PATH 的环境变量
    
return 0;
}

但是我们也很少获取环境变量

环境变量通常具有全局属性

父进程一直都不会变

父进程是命令行解释器

命令行上启动的进程,父进程都是bash(以及把系统的环境变量都导入的,,也可以继承给子进程),也是用fork启动的,

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LRgbApwk-1647503602596)(E:/Typora%E4%BA%91%E7%AC%94%E8%AE%B0%E6%9C%AC/picture/image-20220317152931780.png)]

my_env是一个本地变量

也可以被子进程继承

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-oRO2hW5m-1647503602596)(E:/Typora%E4%BA%91%E7%AC%94%E8%AE%B0%E6%9C%AC/picture/image-20220317153254465.png)]

但是不是环境变量

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IzeFqVkn-1647503602597)(E:/Typora%E4%BA%91%E7%AC%94%E8%AE%B0%E6%9C%AC/picture/image-20220317153351778.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hEksAeOI-1647503602598)(E:/Typora%E4%BA%91%E7%AC%94%E8%AE%B0%E6%9C%AC/picture/image-20220317153715456.png)]

我们在命令行上写的也是环境变量(是父进程的)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pUCf5Wue-1647503602598)(E:/Typora%E4%BA%91%E7%AC%94%E8%AE%B0%E6%9C%AC/picture/image-20220317153807734.png)]

将这个变量导成环境变量,实际上是导给了bash的环境变量列表

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WdWNHsvz-1647503602598)(E:/Typora%E4%BA%91%E7%AC%94%E8%AE%B0%E6%9C%AC/picture/image-20220317153915422.png)]

导入之后就可以执行了

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2HuDkpUI-1647503602598)(E:/Typora%E4%BA%91%E7%AC%94%E8%AE%B0%E6%9C%AC/picture/image-20220317154021128.png)]

环境变量具有全局属性,本质上我们的环境变量可以被子进程继承下去,一个bash被设置那么所有的子进程都可以继承下去bash的内容

我们定义的本地变量就无法继承,只能自己用,自己bash使用这个变量,子进程无法使用这个本地变量

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Zevin~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值