命令行参数环境变量和进程空间地址

文章目录

  • 命令行参数
  • 环境变量
  • 进程地址空间

正文开始前给大家推荐个网站,前些天发现了一个巨牛的 人工智能学习网站, 通俗易懂,风趣幽默,忍不住分享一下给大家。 点击跳转到网站。

命令行参数

什么是命令行参数?
我们平时写的代码中写写到的主函数main函数是可以有参数的。
在这里插入图片描述
在这里插入图片描述
我们可以看一下这段代码的运行结果。
在这里插入图片描述
我们可以看到我们输入的字符串被一空格为分隔符分成了若干个字串,并且argc就是字串的个数,argv中放的都是被分割出来的字串。而argv数组最后一个原始是存放的空的,有了这个东西,我们的程序就可以支持各种各样的命令行级别的指令选项的设置,也是为了让我们的一个程序对不同的选项做出不同的动作。

环境变量

环境变量(environment variables)一般是指在操作系统中用来指定操作系统运行环境的一些参数如:我们在编写C/C++代码的时候,在链接的时候,从来不知道我们的所链接的动态静态库在哪里,但是照样可以链接成功,生成可执行程序,原因就是有相关环境变量帮助编译器进行查找。环境变量通常具有某些特殊用途,还有在系统当中通常具有全局特性。

常见的环境变量

我们在执行自己的可执行程序但是都需要加一个./,不然运行不要,系统找不到我们的可执行程序,但是在执行系统的命令是却不需要这样做,直接输入程序名称就可以运行,这是为什么?为什么系统的命令直接就可以执行我们的程序就必须要加一个./,我们直到不管是什么程序,系统要执行,就必须找到它,我们的执行不了而系统的可以执行只有一个原因,就是系统中一定存在默认的搜索路径。
这个默认的搜索路径就放在一个环境变量PATH中。Linux中可以使用$环境变量来查看环境变量中的内容。
在这里插入图片描述

所以PATH环境变量就是存放系统默认的搜索路径。只要我们将我们自己的程序的路径加到这个默认路径中,我们的进程也可以直接运行。

除了PATH环境变量外还有HOME,PWD等等很多环境变量。
在这里插入图片描述

其中HOME就是我们的家目录,PWD就是我们当前所处的目录。

这也就可以解释为为什么我们普通用户登录后是在/home/xxx,而root是在/root下的原因了。

在这里插入图片描述
系统中会存在大量的环境变量,每一个环境变量都有它自己特殊的用途,用来完成特定的系统功能。

在Linux中查看所有的环境变量命令是env。
在这里插入图片描述
我们也可以创建环境变量,在Linux中直接在命令行中使用 环境变量名=什么 就可以创建一个变量,不过这种变量不是环境变量叫做本地变量,我们需要用export导出一下才是环境变量,而且每一次我们重新登录服务器时,环境变量都会被更新,不会保留之前的操作,也就是说,就算我们修改了系统的环境变量也没关系,只需要重新登录一下云服务器就好了,那么为什么这样呢?

我们的命令行启动的进程都是shell/bash的子进程,子进程的命令行参数和环境变量都是父进程给我们传递的,而我们更改的是命令行内部的环境变量信息,而我们每一次重新登录都会给我们都会给我们形成新的bash解释器并且新的bash解释器自动读取新的环境变量表信息,所以我们可以大胆的推测,父进程的环境变量是以脚本配置的文件存在的。
而在我们目前的系统中,我们每一次登录我们的bash都会读取 .bash_profile文件,文件中的内容为我们形成一张环境变量表信息。
在这里插入图片描述

这个文件一般是存在我们的家目录中的。

我们在外面可以很好的获取环境变量,但是编码如何获取环境变量呢?

  1. 我们可以通过函数getenv来获取环境变量

在这里插入图片描述

  1. main函数是可以有第三个参数的,第三个参数就是环境变量表

在这里插入图片描述
这个环境变量表最后也是以null结尾的。

  1. C语言是有一个全局变量指向环境变量表的

在这里插入图片描述
我们可以直接使用envrion来获取环境变量。

在这里插入图片描述

环境变量通常具有全局属性,可以被子进程继承下去。

如果我们把PATH清空,我们会发现大部分命令都跑不了,但是还有一部分命令是可以跑的。
在这里插入图片描述
我们知道Linux是又C/C++写的,Linux中大部分命令都是子进程,但是也有一部分是Shell的一个函数。

所以Linux的命令就分为两种:

  1. 常规命令,Shell使用fork让子进程去执行的
  2. 内建命令,Shell命令行的一个函数

本地变量VS环境变量

本地变量只在bash内部有效,不会被子进程继承下去,而环境变量通过让所有子进程继承的方式实现自身的全局属性。

进程地址空间

对于我们C/C++程序员来说,内存空间一般分为如下几个区域:
在这里插入图片描述
其中堆和栈中间有一块很大的区域,堆是向上增长的,而栈是向下增长的,堆栈相对而生。我们创建的变量都是指向低地址的起始位置,变量的本质就是起始地址+偏移量的访问形式。那么这个东西就是我们平时在系统层面说的内存吗?我们可以先来看一个代码

#include <stdio.h>
  2 #include <sys/types.h>
  3 #include <unistd.h>                                                                                                                                                                                           
  4 int val = 10;
  5 int main()
  6 {
  7     pid_t id = fork();
  8 
  9     if(id == 0)
 10     {
 11         //子进程
 12         int cnt = 5;
 13         while(1)
 14         {
 15             if(cnt--==0)
 16             {
 17                 val = 5;
 18             }
 19             printf("i am child, i am pid %d, val = %d, &val = %p\n",getpid(),val,&val);
 20             sleep(1);
 21         }
 22     }
 23     else{
 24         while(1)
 25         {
 26             printf("i am parent, i am pid %d, val = %d, &val = %p\n",getpid(),val,&val);
 27             sleep(1);
 28         }
 29     }
 30     return 0;
 31 }

在这里插入图片描述

我们可以看到在5秒过后,父进程和子进程的val地址一样,但是里面的内容确不一样,那么就只有一个原因,就是他们一定不是物理内存。我们平时写代码用到的地址都是虚拟地址/线性地址。所以说上面的那个图不是内存,是进程地址空间!

在进程地址空间和物理内存中间存在一个叫页表的东西,而页表就是虚拟地址对应映射的物理地址,也就是说,我们每一个运行起来的进程都会有一个进程地址空间,并且都要在系统层面有自己的页表映射结构。
当我们的父进程创建子进程是,把它的进程地址空间和页表都给子进程拷贝一份,然后他们遵循写时拷贝的原则,当需要修改时,由于进程间是存在独立性的,所以子进程修改不能影响父进程,所以它就要重新再物理内存中开一块空间,然后修改自己的页表映射,所以才会存在同一块地址但是里面的东西是不一样的,本质就是他们映射的物理内存是不一样的。

在这里插入图片描述
地址空间每一个进程都有,所以OS也要对地址空间进行管理,所以地址空间就是一个内核的数据结构对象,就是一个内核结构体,里面需要对各个区域进行划分,我们每一个进程都可以使用00000000~FFFFFFFF这么大的内存,但是每个进程都不可能使用这么多的内存,因为就算你能用的了OS也不会允许,所以每一地址空间的内核数据结构中都是一些XXX_start,XXX_end的一些字段,表示一个区域的范围,如果某个需要增加,就修改字段就可以了。在Linux中这个虚拟地址空间就是叫做 struct mm_struct{}.

页表结构除了有虚拟地址->物理地址的映射外,在页表的后面还会存在两个字段,一个是该区域的访问权限字段,还有一个是映射的物理地址是否进行了空间分配&&是否存在内容,我们知道对于代码段和字符常量去的数据是不可以修改的,所以有人恶意修改的话,OS在页表层面就把它阻止了,所以我们平时对字符常量没法修改,本质还是它在页表映射中访问权限为只读,而第二个字段就是如果我们进程在阻塞的时候,OS可能会把我们的代码和数据暂时移除内存,所以我们在访问前要先看数据是否在内存中,如果不在内存中,OS就需要为我们开辟物理内存,把数据拷贝进来,然后进行页表映射,然后才能正常的执行我们的代码,该过程也叫做缺页中断。
CPU中是存在一个寄存器CR3存的是页表的地址(物理地址).
为什么存在进程地址空间呢?

  1. 让进程以统一的视角看待内存,所以任意一个进程,可以通过地址空间+页表将乱序的内存数据变为有序,分门别类规划好。
  2. 存在虚拟地址空间和页表,可以很好的进行访问内存的安全检查。
  3. 通过页表,进程管理只管页表左边的一部分,不管右边的,右边的由操作系统的内存管理来完成,所以可以很好的将进程管理和内存管理解耦。而且通过页表可以让相同地址的内容映射到不同的物理地址中,实现进程的独立性。

写时拷贝

在这里插入图片描述
我们知道创建子进程后,子进程和父进程数据和代码都是共享的,当有一方要修改时要发生写时拷贝,那么这个写时拷贝OS是什么时候做的呢?
其实在我们创建子进程时,代码和数据父进程和子进程都是共享的,并且他们在页表中的权限也被设置了为只读,所以当OS要进行写入时,会对它进程检查,如果是数据区是可以写入的,那么就写时拷贝,如果是代码区,本身就是只读的,就报错。所以当页表因为权限问题出错时,有可能是真的错了,也有可能不是出错,而是触发写时拷贝机制。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【JavaEE进阶】 关于应用分层

文章目录 &#x1f38b;序言&#x1f343;什么是应⽤分层&#x1f38d;为什么需要应⽤分层&#x1f340;如何分层(三层架构)&#x1f384;MVC和三层架构的区别和联系&#x1f333;什么是高内聚低耦合⭕总结 &#x1f38b;序言 在我们进行项目开发时我们如果一股脑将所有代码都…

限流算法之固定窗口算法

文章目录 原理示例图 优缺点优点缺点 示例代码java 适用场景不推荐原因如下&#xff1a; 原理 固定窗口算法是一种常见的限流算法&#xff0c;它通过在固定长度的时间窗口内限制请求数量来实现限流。这种算法的原理是在每个时间窗口内&#xff0c;对到达的请求进行计数&#x…

操作系统课程设计-内存管理

目录 前言 1 实验题目 2 实验目的 3 实验内容 3.1 步骤 3.2 关键代码 3.2.1 显示虚拟内存的基本信息 3.2.2 遍历当前进程的虚拟内存 4 实验结果与分析 5 代码 前言 本实验为课设内容&#xff0c;博客内容为部分报告内容&#xff0c;仅为大家提供参考&#xff0c;请勿直…

【白皮书下载】GPU计算在汽车中的应用

驾驶舱域控制器 (CDC) 是汽车 GPU 的传统应用领域。在这里&#xff0c;它可以驱动仪表板上的图形&#xff0c;与车辆保持高度响应和直观的用户界面&#xff0c;甚至为乘客提供游戏体验。随着车辆屏幕数量的增加和分辨率的提高&#xff0c;对汽车 GPU 在 CDC 中进行图形处理的需…

Azure Machine Learning - 聊天机器人构建

目录 聊天机器人架构概述消耗成本环境准备打开开发环境部署和运行将聊天应用部署到 Azure使用聊天应用从 PDF 文件获取答案使用聊天应用设置更改答复行为 本文介绍如何部署和运行适用于 Python 的企业聊天应用示例。 此示例使用 Python、Azure OpenAI 服务和 Azure AI 搜索中的…

数据库-数据库分类

数据库可以分为关系型数据库和非关系型数据库&#xff0c;常见的数据库如下 关系型数据库 关系型数据库是一种采用关系模型来组织数据的数据库&#xff0c;它以行和列的形式存储数据&#xff0c;以便于用户理解。关系型数据库中的数据以二维表的形式组织&#xff0c;被称为表…

Android CarService源码分析

文章目录 一、CarService的基本架构1.1、Android Automative整体框架1.2、Framework CarService1.3、目录结构1.3.1、CarService1.3.2、Car APP 二、CarService的启动流程2.1、系统启动后在SystemServer进程中启动CarServiceHelperService2.2、CarService启动 三、CarService源…

百度地图实现搜索并在地图上标注,手动点击标注获取经纬度

在代码只需要替换为你自己的key即可。 如何申请key:如何申请百度地图ak?|2023年5月更新版 - 知乎 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><title>百度地图搜索</title><!-- 引入百度地…

基于内容的图像web检索系统

题目&#xff1a;基于内容的图像在线检索系统 简介&#xff1a;基于内容的图像在线检索系统&#xff08;Content Based Online Image Retrieval , 以下简称 CBOIR&#xff09;&#xff0c;是计算机视觉领域中关注大规模数字图像内容检索的研究分支。典型的CBOIR系统&#xff…

c语言案例双色球

系列文章目录 c语言案例双色球 c语言案例双色球 系列文章目录c语言案例双色球 c语言案例双色球 int main() {srand((unsigned int)time(NULL));//双色球两种原色 红球蓝球&#xff08;61&#xff09;红球1-33 蓝球1-16 打印双色球中奖信息//红色球不能重复 int ball[6];//红球f…

echarts tooltip显示不全问题

在项目里面的tooltip数据特别多&#xff0c;显示不全问题&#xff1a; 1、如果盒子还够大&#xff0c;只是tooltip飘到上面或者下面被覆盖住了&#xff0c;可以考虑confine: true这个属性&#xff0c;将tooltip限制在盒子内; 2、如果盒子比较小&#xff0c;展示不全的话&#…

如何再造宇宙厂所有APP?

本文内容&#xff0c;纯属十年老架构师杜撰&#xff0c;切勿照着实操&#xff0c;可能会给你带来几十亿的流量&#xff0c;怕你的服务器扛不住。 1. 破音 前端用uniapp&#xff0c;花800买个短视频应用模板&#xff0c;后端用golang支持高并发, 数据库用图数据库加elastic se…

本周五上海见 第二届证券基金行业先进计算技术大会暨2024低时延技术创新实践论坛(上海站)即将召开

低时延技术是证券基金期货领域业务系统的核心技术&#xff0c;是打造极速交易系统领先优势的关键&#xff0c;也是证券基金行业关注的前沿技术热点。 1月19日下午&#xff0c;第二届证券基金行业先进计算技术大会暨2024低时延技术创新实践论坛&#xff08;上海站&#xff09;即…

物联网网关与plc怎么连接?

物联网网关与plc怎么连接&#xff1f; 物联网是当今社会中最热门的技术之一&#xff0c;而物联网网关则是连接物联网设备与云平台的核心设备之一。物联网网关在连接各种传感器和设备时起着至关重要的作用。而另一种广泛应用于工业控制和自动化领域的设备是可编程逻辑控制器&…

回馈科教,非凸科技助力第48届ICPC亚洲区决赛

1月12日-14日&#xff0c;“华为杯”第48届国际大学生程序设计竞赛&#xff08;ICPC&#xff09;亚洲区决赛在上海大学成功举办。非凸科技作为此次赛事的支持方之一&#xff0c;希望携手各方共同推动计算机科学和技术的发展。 这是一场智慧的巅峰对决&#xff0c;320支优秀队伍…

机器学习之卷积神经网络

卷积神经网络是一类包含卷积计算且具有深度结构的前馈神经网络,是深度学习的代表算法之一。卷积神经网络具有表征学习能力,能够按其阶层结构对输入信息进行平移不变分类,因此又称为SIANN。卷积神经网络仿照生物的视知觉机制构建,可以进行监督学习和非监督学习,其隐含层内的…

【vsan数据恢复】vsan逻辑架构出现故障的数据恢复案例

VSAN数据恢复环境&#xff1a; 一套有三台服务器节点的VSAN超融合基础架构&#xff0c;每台服务器节点上配置2块SSD硬盘和4块机械硬盘。 每个服务器节点上配置有两个磁盘组&#xff0c;每个磁盘组使用1个SSD硬盘作为缓存盘&#xff0c;2个机械硬盘作为容量盘。三台服务器节点上…

Pyspark 安装(Mac M2版)

引言 本文为个人本地部署pyspark遇到的问题以及解决办法&#xff0c;包含个人的一些理解&#xff0c;仅供参考。设备&#xff1a; Mac M2 安装过程 安装HomeBrew Mac 上用来管理安装包的&#xff0c;可能早期的 Macos 自带但是起码我个人的 Mac 是需要安装的(以下安装方法个…

C++编写、生成、调用so库详解(二)

我们上篇中主要讲了怎么去打包so库 C编写、生成、调用so库详解(一) 这篇我们就来说一些怎么调用so库 目录 1.调用符合JNI标准的so库 2.调用不符合JNI标准的so库 上面说了两种不同类型的so库,我们分别来看一下怎么调用这两种,在调用so库之前,我们先说一下直接调用上面写的C…

TQ7.2 CPG1000A,荧光淬灭剂Tide Quencher 7.2 CPG 1000A,可以用于研究荧光标记分子的动力学行为

您好&#xff0c;欢迎来到新研之家 文章关键词&#xff1a;Tide Quencher 7.2 CPG 1000A&#xff0c; TQ7.2 CPG1000A&#xff0c;荧光淬灭剂Tide Quencher 7.2 CPG 1000A 一、基本信息 产品简介&#xff1a;Tide Quencher 7.2 CPG 1000A can quench fluorescence signals. …
最新文章