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

命令行参数:
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{ //parentprintf("parent[%d]: %d : %d\n", getpid(), g_val, &g_val);}return 0;}

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

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

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

相关文章

基于Matlab 模拟停车位管理系统【源码 GUI】

系统对进入停车位的车辆进行车牌识别&#xff0c;将识别出来的车牌号显示出来&#xff1b;然后对车主进行人脸识别&#xff0c;框出车主照片的人脸部分作为车主信息的标记&#xff0c;记录在系统库中。车辆在库期间&#xff0c;系统使用者可以随意查看车辆与车主信息的获取过程…

SpringBoot项目集成ONLYOFFICE

ONLYOFFICE 文档8.2版本已发布&#xff1a;PDF 协作编辑、改进界面、性能优化、表格中的 RTL 支持等更新 文章目录 前言ONLYOFFICE 产品简介功能与特点Spring Boot 项目中集成 OnlyOffice1. 环境准备2. 部署OnlyOffice Document Server3. 配置Spring Boot项目4. 实现文档编辑功…

学习笔记:微服务技术栈(一)服务治理框架SpringCloud

教学视频链接&#xff1a; 【SpringCloudRabbitMQDockerRedis搜索分布式&#xff0c;系统详解springcloud微服务技术栈课程|黑马程序员Java微服务】 目录 前言一、认识微服务1.1 服务架构1.2 微服务架构1.3 SpringCloud 二、服务拆分及远程调用2.1 服务拆分细节2.2 服务间调用 …

前端小练习——星辰宇宙(JS没有上限!!!)

前言&#xff1a;在刚开始学习前端的时候&#xff0c;我们会学习到前端三件套中的JavaScript&#xff0c;可能那时候读者没有觉得JavaScript这个语言有多么的牛逼&#xff0c;本篇文章将会使用一个炫酷的案例来刷新你对JavaScript这个语言的认知与理解。 ✨✨✨这里是秋刀鱼不做…

【网络】传输层协议TCP(下)

目录 四次挥手状态变化 流量控制 PSH标记位 URG标记位 滑动窗口 快重传 拥塞控制 延迟应答 mtu TCP异常情况 四次挥手状态变化 之前我们讲了四次挥手的具体过程以及为什么要进行四次挥手&#xff0c;下面是四次挥手的状态变化 那么我们下面可以来验证一下CLOSE_WAIT这…

XingHan-Team团队官网系统源码 全开源

XingHan-Team 官网程序是一个现代化的企业官网管理系统&#xff0c;由星涵网络工作室开发。 本系统提供了完整的网站内容管理功能&#xff0c;包括用户管理、内容发布、成员查询、成员申请等功能。 源码下载&#xff1a;https://download.csdn.net/download/m0_66047725/8995…

vrrp和mstp,vrrp和byd

vrrp和mstp 思路 vrrp是用来虚拟网关&#xff0c;噢&#xff0c;是虚拟一条虚拟网关 优先级&#xff0c;priority越大越优先&#xff0c;优先级相同&#xff0c;哪个的路由器的vrrp先起来&#xff0c;谁就是主 mstp是快速生成树协议&#xff0c;防止环路用的 优先级越小越优…

图说复变函数论重大错误:将无穷多各异平面误为同一面

黄小宁 医学若将前所未知的“新冠”病毒误为已熟知的流感病毒&#xff0c;后果...&#xff1b;数学将前所未知的点集误为已熟知的集就会引出一连串的重大错误。 h定理&#xff1a;点集AB的必要条件是A≌B。 证&#xff1a;&#xff08;1&#xff09;任何图≌自己是几何学最起码…

SpringBoot技术:打造新闻稿件管理平台

2相关技术 2.1 MYSQL数据库 MySQL是一个真正的多用户、多线程SQL数据库服务器。 是基于SQL的客户/服务器模式的关系数据库管理系统&#xff0c;它的有点有有功能强大、使用简单、管理方便、安全可靠性高、运行速度快、多线程、跨平台性、完全网络化、稳定性等&#xff0c;非常…

深入理解DMA(直接存储器访问)

直接存储器访问(DMA,Direct Memory Access)是一种允许外设和内存之间直接传输数据的机制,旨在提高数据传输的效率,减少CPU的负担。在传统的数据传输中,CPU负责所有的数据移动和处理,这导致CPU资源被大量占用,影响系统的整体性能。而DMA的出现,正是为了优化这一过程,使…

【Wi-Fi】WiFi中QAM及16-QAM、64-QAM、512-QAM、1024-QAM、2048-QAM、4096-QAM整理

参考链接 什么是QAM&#xff1f;QAM是如何工作的&#xff1f; - 华为 不同阶QAM调制星座图中&#xff0c;符号能量的归一化计算原理 - 知乎 16 QAM modulation vs 64 QAM modulation vs 256 QAM modulation 512 QAM vs 1024 QAM vs 2048 QAM vs 4096 QAM modulation type…

EHOME视频平台EasyCVR萤石设备视频接入平台视频诊断技术可以识别哪些视频质量问题?

EasyCVR视频监控汇聚管理平台是一款针对大中型项目设计的跨区域网络化视频监控集中管理平台。萤石设备视频接入平台EasyCVR不仅具备视频资源管理、设备管理、用户管理、运维管理和安全管理等功能&#xff0c;还支持多种主流标准协议&#xff0c;如GB28181、GB35114、RTSP/Onvif…

42python数据分析numpy基础之trace计算对角线元素的和

python的numpy库的trace()函数&#xff0c;计算对角线元素的和。 用法 numpy.trace(a, offset0, axis10, axis21, dtypeNone, outNone)描述 numpy.trace(a)&#xff0c;返回数组a的对角线元素的和。 入参 a&#xff1a;必选&#xff0c;数组&#xff0c;列表&#xff0c;元…

WPF+MVVM案例实战(二十三)- 阴影效果详解

文章目录 1、案例效果2、阴影属性参数说明3、阴影效果实现1、案例效果 2、阴影属性参数说明 WPF 中,控件的阴影效果是通过附加属性 Effect 来实现的。这里详细说明以下阴影效果的各个参数。 属性描述BlurRadius阴影模糊程度,值越大越模糊Color阴影颜色Opacity阴影透明度,默…

Vue项目开发:Vuex使用,表单验证配置,ESLint关闭与常见问题解决方案

文章目录 vuexvue配置form表单验证移除vue中表单验证的两种方法关闭vue项目的eslint代码校验做vue项目出现的问题 vuex Vue提供的状态管理工具&#xff0c;用于统一管理我们项目中各种数据的交互和重用&#xff0c;存储我们需要用到的数据对象属性 state&#xff1a;vuex的基本…

HTTP、WebSocket、gRPC 或 WebRTC:各种协议的区别

在为您的应用程序选择通信协议时&#xff0c;有很多不同的选择。 本文将了解四种流行的解决方案&#xff1a;HTTP、WebSocket、gRPC 和 WebRTC。 我们将通过深入学习其背后原理、最佳用途及其优缺点来探索每个协议。 通信方式在不断改进&#xff1a;变得更快、更方便、更可靠&…

24.11.3

星期一&#xff1a; 补24武汉高校联合程序设计新生赛 C cf传送门 最开始用倍增树链刨分&#xff0c;稳定T 思路&#xff1a;处理出树链刨分的dfn序和重链等前置信息&#xff0c;然后对每条重链开个set&#xff08;常见方法&#xff0c;用于存断开的边&…

大端存储和小端存储

大端存储和小端存储 在计算机系统中&#xff0c;数据在内存中的存储方式并不是唯一的。对于多字节的数据类型&#xff08;如 int、float 等&#xff09;&#xff0c;计算机可以以不同的方式在内存中存储它们。这些存储方式通常分为两种&#xff1a;大端存储&#xff08;Big-En…

如何使用RabbitMQ和Python实现广播消息

使用 RabbitMQ 和 Python 实现广播消息的过程涉及设置一个消息队列和多个消费者&#xff0c;以便接收相同的消息。RabbitMQ 的 “fanout” 交换机允许你将消息广播到所有绑定的队列。以下是如何实现这一过程的详细步骤。 1、问题背景 在将系统从Morbid迁移到RabbitMQ时&#x…

C#-类:成员变量

声明在类语句块中&#xff0c;描述对象的特征&#xff0c;可为任意变量类型 可包含&#xff1a;枚举、结构体、类、其他 1. 类成员的详细定义 特征->成员变量&#xff1a;包括类的数据&#xff1a;变量、常量、事件的成员行为->成员方法&#xff1a;普通方法、属性、构…