Linux-环境变量

文章目录

    • 常见环境变量
      • 查一个环境变量
      • 系统调用接口getenv
    • 什么是环境变量?
      • 命令行参数
      • 向量表
      • 两张核心向量表
    • 结论
      • 证明一下子进程继承了父进程的环境变量?
        • export将本地变量变成环境变量
    • 本地变量&&内建命令
      • 本地变量:只会在本BASH内部有效,不会被继承
      • 内建命令
    • 总结
      • 和环境变量相关的命令
      • 通过代码如何获取环境变量的其他方式

常见环境变量

在这里插入图片描述

查一个环境变量

echo需要加上$符号才能打印出来环境变量

系统调用接口getenv

char *getenv(const char *name);
在代码中获取一个环境变量

  1. PATH:Linux系统的指令搜索路径

bash怎么知道指令在哪里?
bash内部维护了PATH环境变量(指令的搜索路径)

which 是如何找到指令路径的?
对PATH进行搜索

修改PATH
在这里插入图片描述

PATH=/home/ljh  //将PATH修改成只有/home/ljh,大部分指令无法使用

$PATH是内存级的环境变量,修改后重新登陆即可恢复

  1. SHELL
    用的哪一个SHELL,shell有bash等。。
  2. USER
    当前用户是?

有没有权限得先知道你是谁,对权限理解进一步加深,不同用户根据环境变量不同受限制不同
在这里插入图片描述

  1. HOME
    家目录

什么是环境变量?

环境变量是系统提供的一组name=value形式的变量,不同的环境变量有不同的用户,通常具有全局属性

命令行参数

int main(int argc,char* argv[])//指针数组,存的是char*,字符串
{}

c = count 个数
v = value
数组里有多少个元素
我们之前学的main函数从来没有参数,那这两个参数是什么呢?管他是啥我先打印出来看看

  int i = 0;for(; i<argc ;i++){printf("argv[%d]->%s\n",i,argv[i]);}

结果
打印出来这不是命令行参数吗?
在这里插入图片描述
为什么要这么干?
为指令、工具,软件等提供命令行选项的支持!!
例如ls -l 的实现

		// if(argc != 2)43    // {44    //     printf("Usage: %s -[a|b|c|d]\n",argv[0]);45    //     return 0;46    // }47    // 48    // if(strcmp(argv[1],"--help") == 0)49    // {                                                                                                                            50    //     printf("Usage: %s -[a|b|c|d]\n",argv[0]);51 52    // }else if(strcmp(argv[1],"-a") == 0)53    // {54    //     printf("功能1\n");55    // }else if(strcmp(argv[1],"-b") == 0)56    // {       57    //     printf("功能2\n");58    // }else if(strcmp(argv[1],"-c") == 0)59    // {60    //     printf("功能3\n");61    // }else if(strcmp(argv[1],"-d") == 0)62    // {63    //     printf("功能4\n");64    // }else 65    // {66    //     printf("default\n");67    // }

向量表

main函数被Startup调用
你以为你写的./mycmd -a -b -c,其实输入的是字符串"./mycmd -a -b -c",然后以空格为分隔符打散放入的argv[ ]数组中,有几个字符串argc就是几,然后传入给main函数。
并且argv数组 最后一个位置是NULL
所以还可以不用argc遍历,直接利用最后一个是NULL来遍历

 int i = 0;for(; argv[i] ;i++){printf("argv[%d]->%s\n",i,argv[i]); //命令行参数表}

在这里插入图片描述
那这个命令行参数和环境变量有什么关系呢?
还真有点关系,因为main函数还有第三个变量env

int main(int argc,char* argv[],char* env[])
{
}

char* env[](环境变量表)和命令行参数表结构一摸一样
在这里插入图片描述
那就打印出来看看

	   int i = 0;for(; env[i] ;i++){printf("env[%d]->%s\n",i,env[i]);    //环境变量表}

结果
打印出来了环境变量
在这里插入图片描述

两张核心向量表

  1. 命令行参数表
  2. 环境变量表

不要以为一个进程启动就是把程序加载到内存,而是当我们自己的程序变成进程再启动时,一定有人调用main函数,给main函数把这两张表传入

结论

环境变量概念中的具有全局属性是什么意思?
我们所运行的进程,都是子进程,bash本身在启动的时候,会从操作系统的配置文件中读取环境变量信息,子进程会继承父进程交给我的环境变量!

证明一下子进程继承了父进程的环境变量?

思路:自己增加一个环境变量,子进程如果会继承就会被看到

export将本地变量变成环境变量

MY_VAL=123456//本地变量
export MY_VAL=123456//导出环境变量

同样打印环境变量表

       int i = 0;for(; env[i] ;i++){printf("env[%d]->%s\n",i,env[i]);    //环境变量表}

在这里插入图片描述
在这里插入图片描述
bash里面有自己定义的MY_VALUE,自己的mycmd子进程也查到了,验证完成。


子进程要修改环境变量不能影响父进程的环境变量,要发生写时拷贝

以前main函数从来没传入env,那么子进程是如何继承的?
第1种直接传入
第2种继承方式,到地址空间再谈

本地变量&&内建命令

本地变量:只会在本BASH内部有效,不会被继承

什么时候我的进程需要本地变量呢?
比如ps1搞出了命令行的格式 user hostname w工作目录 $
所以我们需要一些只在bash内部的符号,不要被子进程继承下去,所以有了本地变量的概念

在这里插入图片描述

内建命令

问题:echo要不要创建子进程,如果创建,那么它无法继承bash的本地变量,但是这里却打印出来了,为什么呢?
在这里插入图片描述
王婆(bash)说媒 如果这个媒特别难说,那么就要创建子进程,但是如果这个媒很有把握,那王婆还是愿意自己上的
所以echo是内建命令
同样cd 也是内建命令 - 系统调用chdir()
在这里插入图片描述

		  sleep(15);18     printf("change begin\n");  //目录切换,内建命令cd模拟19     if(argc == 2)20     {21        chdir(argv[1]);22     }23     24     sleep(15);25     printf("change end\n");   

我们可以模拟cd命令,利用系统调用chdir()更改自己的工作目录,而不是创建子进程
如果我们今天自己写的mycmd是写的bash本身的话,他不给你创建子进程同样利用chdir改变工作目录cwd
在这里插入图片描述
注意
./mycmd / 更改本身的cwd
而pwd创建子进程继承了bash,bash又没改,所以还是原来的工作目录,所以只能ls /proc去看cwd
在这里插入图片描述

总结

和环境变量相关的命令

在这里插入图片描述

不同的环境变量用途不同,所以需要具体问题具体分析

进程 环境变量 进程地址空间 三位一体 进程的概念再也不是问题

通过代码如何获取环境变量的其他方式

通过第三方变量environ获取

		int main(int argc,char* argv[])//指针数组7 {               8     extern char** environ; //C语言提供的全局变量,形参中不用再传递env环境变量表了                                                  9     int i = 0;  10     for(; environ[i] ;i++) //二级指针 指向char* 环境变量表 ,类似于形参char* env[]数组退化为指针char ** env   11     {  12         printf("%d : %s\n",i,environ[i]);  13     } return 0;} 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/82275.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

iis站点备份以及端口号查找

文件地址 %windir%\system32\inetsrv\config

科技赋能,教育革新——大步迈向体育强国梦

在 "全民健身"、"体育强国建设"战略的推进下&#xff0c;体育考试成绩被纳入重要升学考试且分值不断提高&#xff0c;体育科目的地位逐步上升到前所未有的高度&#xff0c;在此趋势下&#xff0c;体育教学正演变出更多元化、个性化的需求。然而现实中却面临…

Mybatis (3)-----分页的运用

目录 一、分页查询 二&#xff0c;特殊的字符处理 三、总结 前言&#xff1a;在我们上篇已经学的动态sql的基础上&#xff0c;今天继续讲解关于maybatis的分页&#xff0c;特殊的字符处理。希望这篇博客可以帮助到大家哦&#xff01; 一、分页查询 为什么要重写mybatis的分…

邀请函 | 区块链如何助力建设“健康中国”?ESG系列研讨会“医疗”专场来袭!

党的十九大报告指出&#xff0c;要全面实施健康中国战略&#xff0c;为人民群众提供全方位全周期健康服务。今年7月&#xff0c;国家卫生健康委等六部门联合印发了《深化医药卫生体制改革2023年下半年重点工作任务》&#xff0c;明确指出要开展全国医疗卫生机构信息互通共享三年…

合宙Air724UG LuatOS-Air LVGL API--对象

对象 概念 在 LVGL 中&#xff0c;用户界面的基本构建块是对象。例如&#xff0c;按钮&#xff0c;标签&#xff0c;图像&#xff0c;列表&#xff0c;图表或文本区域。 属性 基本属性 所有对象类型都共享一些基本属性&#xff1a; Position (位置) Size (尺寸) Parent (父母…

Ubuntu18.04 交叉编译curl-7.61.0

下载 官方网址是&#xff1a;curl 安装依赖库 如果需要curl支持https协议&#xff0c;需要先交叉编译 openssl,编译流程如下&#xff1a; Ubuntu18.04 交叉编译openssl-1.1.1_我是谁&#xff1f;&#xff1f;的博客-CSDN博客 解压 # 解压&#xff1a; $tar -xzvf curl-7.61.…

QT TLS initialization failed问题(已解决) QT基础入门【网络编程】openssl

问题: qt.network.ssl: QSslSocket::connectToHostEncrypted: TLS initialization failed 这个问题的出现主要是使用了https请求:HTTPS ≈ HTTP + SSL,即有了加密层的HTTP 所以Qt 组件库需要OpenSSL dll 文件支持HTTPS 解决: 1.加入以下两行代码获取QT是否支持opensll以…

基于matlab的lorenz混沌系统仿真与分析

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 matlab2022a 3.部分核心程序 ..................................................................................... l…

AMBA总线协议(0)——目录与传送门

一、AMBA总线协议 Arm高级微控制器总线架构&#xff08;Advanced Microcontroller Bus Architecture&#xff0c;AMBA&#xff09;是一种开放式标准片上互联规范&#xff0c;用于连接和管理片上系统&#xff08;System on Chip,Soc&#xff09;中的功能块。 AMBA是一种广泛用于…

Mac操作系统Safari 17全新升级:秋季推出全部特性

苹果的内置浏览器可能是Mac上最常用的应用程序&#xff08;是的&#xff0c;甚至比Finder、超级Mac Geeks还要多&#xff09;。因此&#xff0c;苹果总是为其浏览器Safari添加有用的新功能。在今年秋天与macOS Sonoma一起推出的第17版中&#xff0c;Safari可以帮助你提高工作效…

如何从零开始搭建公司自动化测试框架?

搭建的自动化测试框架要包括API测试&#xff0c;UI测试&#xff0c;APP测试三类。以上三类其实可以简化为两类&#xff0c;那就是&#xff1a; 1&#xff09;接口自动化测试框架搭建 2&#xff09;UI自动化测试框架搭建。 没问题&#xff0c;安排&#xff0c;且是手把手教你如何…

车联网技术介绍

上图是目前车联网架构图&#xff0c;基于“云-管-端”的车联网系统架构以支持车联网应用的实现&#xff0c; “云”是指 V2X 基础平台、高基于精度定位平台等基础能力&#xff0c;可实现车辆动态厘米级定位&#xff0c;这将满足现阶段以及未来车联网应用场景的定位精度需求。 “…