命令行参数、环境变量、地址空间

命令行参数:
int main(int argc, char *argv[ ]),main的参数可带可不带。argc参数通常代表后面的char *argv的元素个数有多少。
在这里插入图片描述
在linux中会把输入的字符串存到char *argv[ ]中,在数组的结尾为NULL。
命令行参数可以让同一个程序可以通过不同的选项得以达到不同的功能。本质是交给程序不同的选项用来定制不同的功能。命令行解释器的参数是传给父进程的。
在这里插入图片描述

环境变量(PATH是环境变量的一个):
环境变量默认是在配置文件中的。当操作系统bash在启动时,会把环境变量从文件导入到自己bath的解释器中。
linux系统中存在全局设置,告诉命令行解释器应该去那些路径寻找可执行程序。系统中的配置登陆的时候被加载到PATH中,因为环境变量路径被加载到PATH中被bash拿到,因此直接使用程序不用加上路径,而自己生成的可执行程序是没有被加载到环境变量中,因此需要指明路径。
安装软件相当于把自己的程序加载到环境变量路径中,也就是usr/bin路径中。usr/bin路径中基本是系统中的操作方法。
命令行中的ls等命令可以直接运行是因为 PATH 存放着路径。
echo $PATH - - - 可以查看环境变量路径。
PATH= $PATH:自己的可执行程序路径 - - - 把自己的可执行程序加载到环境变量中,可以直接运行我的程序。自己添加的环境变量路径是内存级别的,重新登陆自己加的就没了。如果想让自己的程序每次启动被自动加载,需要把路径写入到 .bash_profile 中。
env - - - 查看所有环境变量, echo $NAME - - - 查看单个环境变量内容
可以直接自己创建一个环境变量, export: 设置一个新的环境变量 - - - export XXX=yyy,如果不存就是在本地文件内的环境变量。

通过代码获取环境变量:
environ - - - 系统配的全局变量,是一个二级指针。
extern - - - 声名变量。
下述代码运行结果和 env 的信息是一样的,所以,环境变量也是可以被子进程拿到并访问的,因为本身程序父进程就是bash。

#include <stdio.h>
#include <unistd.h>
int main(int argc, char *argv[])
 {
    extern char **environ;
    int i = 0;
    for(; environ[i]; i++){
        printf("%s\n", environ[i]);
    }
    return 0;
 }

bash 启动的时候默认会给子进程形成两张表,一张是 argv[ ] - - - 命令行参数表,一张是 env[ ] - - - 是环境变量表。bash 交给子进程。命令行参数由用户输入,环境变量表由OS的配置文件来。
下述代码和上述代码完成的任务一样,都是把得到的环境变量打印出来。

#include <stdio.h>
#include <unistd.h>
int main(int argc, char *argv[], char *env[])
 {
    int i = 0;
    for(; env[i]; i++){
        printf("%s\n", env[i]);
    }
    return 0;
 }

export 就是把字符串添加env到表中,如果自己添加了一个环境变量也会被上述代码查到。
环境变量具有系统级全局属性,因为环境变量本身会被子进程继承下去。
getenv - - - 获取指定的环境变量。
在这里插入图片描述
自己添加环境变量:HELLO=1234565 - - - 这样先产生一个变量名字,export HELLO - - - 把这个变量添加到环境变量表中,可以用上述代码查看到。如果不使用export 导入到环境变量表中,则这个变量只属于本地,在bash内部有效,无法被子进程继承,导成环境变量才可被获取。unset HELLO - - - 释放掉定义的环境变量。

进程的地址空间
运行下述代码后可以看到下图中,地址相同,但该地址内的内容却不相同。这个地址就是 - - - 虚拟地址

int g_val = 100;
int main()
 {
    pid_t id = fork();
    if(id == 0){ //child,子进程肯定先跑完,也就是子进程先修改,完成之后,父进程再读取
        g_val=300;
        printf("child[%d]: %d : %d\n", getpid(), g_val, &g_val);
    }else{ //parent
        printf("parent[%d]: %d : %d\n", getpid(), g_val, &g_val);
    }
    return 0;
 }

在这里插入图片描述
因为父子进程的虚拟地址和页表基本一样,子继承父的这两。
如果子进程对数据进行修改后,由于进程具有独立性,子进程修改的时候会在物理内存中开辟新空间把老数据拷贝到新空间中,然后重新对子进程的页表构建映射。然后才进行写入工作 - - - 写时拷贝
如果没有写入,父子进程都指向同一块物理内存。只有发生写入才会对物理空间进行临时拷贝,写入的进程的页表中虚拟地址指向的物理地址空间更改。
在这里插入图片描述
地址空间就是一个内核中的 struct mm_struct 结构体,每一个进程都会有自己的进程地址空间,地址空间中有很多区域。
地址空间可以让无序的空间变得有序,让进程以统一的视角看待物理内存以及自己运行的各个区域。可以使得进程管理模块和内存管理模块进行解耦。拦截非法请求,如果请求的空间在页表中没有找到就说明请求非法。
虚拟地址块的每一个区域都会经过页表映射,所以字符常量区不能被修改就是因为页表在管理权限,页表映射的字符常量区是不能被直接修改的这个权限是在页表完成的。
数据不在物理内存 - - - 缺页中断。
程序本身就有地址。加载地址空间和页表中的地址信息都是从可执行程序中加载的。
fork()的返回值有两个,一个是父,一个是子,而fork是父进程的值,因此会发生写时拷贝,写时拷贝会导致好像同一个变量有不同的值。

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

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

相关文章

软件测试学习笔记丨SeleniumPO模式

本文转自测试人社区&#xff0c;原文链接&#xff1a;https://ceshiren.com/t/topic/22525 本文为霍格沃兹测试开发学社的学习经历分享&#xff0c;写出来分享给大家&#xff0c;希望有志同道合的小伙伴可以一起交流技术&#xff0c;一起进步~ 说明&#xff1a;本篇博客基于sel…

网络自动化03:简单解释send_config_set方法并举例

目录 拓扑图设备信息 netmiko涉及方法send_config_set()方法的简单示例代码输出结果代码解释导入模块配置信息config_device_interface_description 函数主程序块总结 send_config_set方法参数&#xff1a;1. enter_config_mode2. config_commands3. enter_config_mode4. error…

UI自动化测试 —— CSS元素定位实践!

前言 自动化测试元素定位是指在自动化测试过程中&#xff0c;通过特定的方法或策略来准确识别和定位页面上的元素&#xff0c;以便对这些元素进行进一步的操作或断言。这些元素可以是文本框、按钮、链接、图片等HTML页面上的任何可见或不可见的组件。 在自动化测试中&#xf…

zxing生成、解析二维码,条形码

1、maven依赖 <!--zxing依赖--><dependency><groupId>com.google.zxing</groupId><artifactId>core</artifactId><version>3.1.0</version></dependency><dependency><groupId>com.google.zxing</groupI…

有效增加网站流量的实用策略和技巧

内容概要 在数字化时代&#xff0c;网站流量的增加被视为在线业务成功的关键。网站流量不仅仅意味着访问者的数量&#xff0c;还影响着品牌知名度、用户参与度和销售转化率。针对这一需求&#xff0c;企业需要采取行之有效的策略&#xff0c;例如搜索引擎优化&#xff08;SEO&…

玄机-应急响应- Linux入侵排查

一、web目录存在木马&#xff0c;请找到木马的密码提交 到web目录进行搜索 find ./ type f -name "*.php" | xargs grep "eval(" 发现有三个可疑文件 1.php看到密码 1 flag{1} 二、服务器疑似存在不死马&#xff0c;请找到不死马的密码提交 被md5加密的…

从 vue 源码看问题 — vue 如何进行异步更新?

前言 在上一篇 如何理解 vue 响应式&#xff1f; 中&#xff0c;了解到响应式其实是通过 Observer 类中调用 defineReactive() 即 Object.defineProperty() 方法为每个目标对象的 key&#xff08;key 对应的 value 为非数组的&#xff09; 设置 getter 和 setter 实现拦截&…

本地部署bert-base-chinese模型交互式问答,gradio

首先下载bert-base-chinese&#xff0c;可以在 Huggingface, modelscope, github下载 pip install gradio torch transformers import gradio as gr import torch from transformers import BertTokenizer, BertForQuestionAnswering# 加载bert-base-chinese模型和分词器 mod…

SYN590RH是SYNOXO全新开发设计的一款宽电压范围,低功耗,高性能,无需外置AGC电容de单芯片ASK或00 K射频接收器

一般描述 SYN590RH是SYNOXO全新开发设计的一款宽电压范围&#xff0c;低功耗&#xff0c;高性能&#xff0c;无需外置AGC电容&#xff0c;灵敏度达到典型-110 dBm,400MHz~450MHz频率范围应用的单芯片ASK或00 K射频接收器。 SYN590RH是一款典型的即插即用型单片高…

Unreal5从入门到精通之如何在指定的显示器上运行UE程序

前言 我们有一个设备,是一个带双显示器的机柜,主显示器是一个小竖屏,可以触屏操作,大显示器是一个普通的横屏显示器。我们用这个机柜的原因就是可以摆脱鼠标和键盘,直接使用触屏操作,又可以在大屏观看,非常适合用于教学。 然后我们为这款机柜做了很多个VR项目,包括Uni…

C++中unordered_map和unordered_set的介绍以及用哈希表封装实现unordered_map和unordered_set

目录 1.unordered_map和unordered_set的使用 1.1unordered_set类的介绍 1.2unordered_set和set的使用差异 1.3unordered_map和map的使用差异 1.4unordered_multimap/unordered_multiset 2.用哈希表封装实现unordered_set和unordered_map 2.1实现出复用哈希表的框架并支持…

stm32学习4

学习目录 一.流水灯1.创建文件2.编写相关代码 一.流水灯 1.创建文件 将方法进行分类保存在不同的 .c 文件中&#xff0c;方便复用和寻找&#xff1b; 创建Hardware\LED文件&#xff0c;其中有led.c和led.h文件&#xff0c;用于存放有关LED灯操作的方法&#xff1b; 在User文…

JVM结构图

JVM&#xff08;Java虚拟机&#xff09;是Java编程语言的核心组件之一&#xff0c;负责将Java字节码翻译成机器码并执行。JVM由多个子系统组成&#xff0c;包括类加载子系统、运行时数据区、执行引擎、Java本地接口和本地方法库。 类加载子系统&#xff08;Class Loading Subsy…

mysql之命令行基础指令

一&#xff1a;安装好mysql后&#xff0c;注册好账号密码。 二&#xff1a;在命令行进行登录的指令如下 mysql -u用户名 -p 例如&#xff1a;mysql -uroot -p; 然后按下回车&#xff0c;进入输入密码。 三&#xff1a;基本指令&#xff1a; 1&#xff1a;查看当前账户的所有…

LabVIEW适合开发的软件

LabVIEW作为一种图形化编程环境&#xff0c;主要用于测试、测量和控制系统的开发。以下是LabVIEW在不同应用场景中的适用性和优势。 一、测试与测量系统 LabVIEW在测试与测量系统中的应用广泛&#xff0c;是工程测试领域的主流工具之一。利用其强大的数据采集与处理功能&…

MySQL表的增删改查(CRUD3约束)

这次我们开始先不复习嗷&#xff0c;等到把数据表的删除说完咱们统一&#xff0c;总结书写 1.数据表的删除&#xff1a; 语法&#xff1a; 1. 使用 DROP TABLE 语句删除单个表 基本语法&#xff1a;DROP TABLE [IF EXISTS] table_name; table_name是要删除的表的名称。IF EXIS…

国内首位聋人 Android 软件工程师体验通义灵码,“这真是太棒了”

Hi 大家好&#xff01; 我就是人见人爱、Bug 闪开的通义灵码&#xff01; 上个月&#xff0c;我上线了一项新能力&#xff1a; 体验通义灵码 workspace&#xff1a;轻松分析项目结构&#xff0c;结合代码仓库理解工程、查询问答等 补充说明&#xff1a;当你需要快速了解一个工…

萌熊数据科技:剑指脑机转入,开启科技新篇章

近日&#xff0c;科技圈传来一则令人瞩目的消息&#xff0c;天津萌熊数据科技有限公司和天津一万年科技发展有限公司在全国范围内大力开展AI加生命科学的主体业务&#xff0c;并明确将朝着脑机转入方向深入发展&#xff0c;引发了行业内外的广泛关注。 天津萌熊数据科技有限公司…

OceanBase 安装使用详细说明

OceanBase 安装使用详细说明 一、系统环境要求二、安装OceanBase环境方案一:在线下载并安装all-in-one安装包方案二:离线安装all-in-one安装包安装前的准备工作三、配置OceanBase集群编辑配置文件部署和启动集群连接到集群集群状态和管理四、创建业务租户和数据库创建用户并赋…