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

命令行参数:
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.xdnf.cn/news/5812.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

Docker学习—Docker核心概念总结

核心概念总结 容器&#xff1a;容器就是将应用运行所需的所有内容比如代码、运行时环境&#xff0c;进行打包和隔离。 容器和虚拟机的对比 虚拟机是在同一个硬件上虚拟化出多个操作系统&#xff08;OS&#xff09;实例。 容器是在操作系统上进行虚拟化&#xff0c;用于隔离…

Java实战项目-基于SpringBoot的新能源汽车个性化推荐系统

博主介绍&#xff1a;✌Java徐师兄、7年大厂程序员经历。全网粉丝13w、csdn博客专家、掘金/华为云等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;&#x1f3fb; 不…

统信UOS设备驱动开发-常见问题

包含linux设备驱动开发的基础知识及统信UOS设备驱动的总体架构,常用的设备驱动开发调试优化手段及在环境搭建和代码编写过程中常见问题处理等。 文章目录 环境搭建如何编译驱动代码编写如何实现同源异构环境搭建 如何编译内核 下载并解压内核源码包,进入源码根目录,内核的编…

基于python主观题自动阅卷系统毕业设计项目

基于python主观题自动阅卷系统毕业设计项目 大家好&#xff0c;我是陈辰学长&#xff0c;一名在 Java 圈辛勤劳作的码农。今日&#xff0c;要和大家分享的是一款基于python主观题自动阅卷系统毕业设计。项目源码以及部署相关事宜&#xff0c;请联系陈辰学长&#xff0c;文末会…

详细分析WebStorageCache 基本知识

目录 1. 基本知识2. Demo 1. 基本知识 相关的源码如下&#xff1a;web-storage-cache WebStorageCache 是一个用于扩展 HTML5 的 localStorage 和 sessionStorage 的库&#xff0c;增加了超时时间管理和序列化功能。它可以存储 JSON 对象&#xff0c;并且在存储数据时可以方便…

如何用手机将驾驶证信息转为结构化Excel表格

在日常生活和工作中&#xff0c;我们经常需要将纸质文档或图片中的信息转化为结构化的电子数据&#xff0c;以便更好地进行管理和分析。驾驶证作为重要的个人证件&#xff0c;其信息的电子化也显得尤为重要。本文将详细介绍如何使用手机将驾驶证信息转化为结构化的Excel表格。 …

Idea自动生成mysql表DML语句

背景 在开发上线的时候&#xff0c;某个表会被多次修改&#xff0c;更改了多个字段。上线的时候需要变更线上数据表&#xff0c;会很麻烦。需要自己写很多个DML语句。 IDEA解决方案 使用IDEA的数据库插件可以很快的得到变更表的DML语句。 步骤&#xff1a; 勾选不同环境的两…

自动化细胞核分割与特征分析

自动化细胞核分割与特征分析 引言效果展示HoverNet概述HoverNet原理分析整体网络框架实例分割原理 HoverNet评估结果复现过程细胞核特征应用说明参考文献总结备注资源获取 本文所涉及所有资源均在传知代码平台可获取 引言 细胞核分割和分类在医学研究和临床诊断中具有重要意义…

[ZJCTF 2019]NiZhuanSiWei

[ZJCTF 2019]NiZhuanSiWei 审题 看到可以传入file&#xff0c;text&#xff0c;和password三个参数。 知识点 php伪协议&#xff0c;反序列化 解题 传入text&#xff0c;看到有file_get_content函数&#xff0c;这个函数表示读取$text文件里的值&#xff0c;返回字符串。 所…

Transformer究竟是什么?预训练又指什么?BERT

目录 Transformer究竟是什么? 预训练又指什么? BERT的影响力 Transformer究竟是什么? Transformer是一种基于自注意力机制(Self-Attention Mechanism)的神经网络架构,它最初是为解决机器翻译等序列到序列(Seq2Seq)任务而设计的。与传统的循环神经网络(RNN)或卷…

阿里云对象存储OSS

Alibaba Cloud OSS Alibaba Cloud OSS: 阿里云对象存储服务&#xff08;Object Storage Service&#xff0c;简称 OSS&#xff09;&#xff0c;是阿里云提供的海量、安全、低成本、高可靠的云存储服务。您可以在任何应用、任何时间、任何地点存储和访问任意类型的数据。 1.引…

element plus中修改el-table的样式

文章目录 前情提要相关环境package.jsonvue代码结果 方式一直接看代码 方式二直接看代码 前情提要 因为项目中用到el-table的时候&#xff0c;需要将el-table表格的样式进行修改&#xff0c;将整个表格的背景颜色从白色变成透明&#xff0c;使得表格变得透明之后&#xff0c;展…

HTML前端页面设计静态网站

浅浅分享一下前端作业&#xff0c;大佬轻喷~ <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>一个网…

tauri开发中如果取消了默认的菜单项,复制黏贴撤销等功能也就没有了,解决办法

取消默认的菜单项&#xff1a;清除tauri默认的菜单项&#xff0c;让顶部的菜单menu不显示-CSDN博客 就是通过配置空菜单&#xff0c;让菜单不显示&#xff0c;但是这个引发的问题就是复制黏贴撤销等功能也就没有了&#xff0c;解决办法&#xff1a; 新增加编辑下的子菜单&…

02 高效调优:Oracle内存体系的精细化管理实践

文章目录 高效调优&#xff1a;Oracle内存体系的精细化管理实践一、Oracle内存体系的核心组件1.1 系统全局区&#xff08;SGA&#xff09;1.2 程序全局区&#xff08;PGA&#xff09; 二、各组件的交互关系2.1 Buffer Cache与磁盘I/O2.2 Shared Pool与SQL执行2.3 PGA与会话管理…

Qt中的Model与View 3:从样例出发理解QStringListModel和QListView

目录 Ui文件设计如下&#xff1a; 初始化窗口 这里&#xff0c;就是一经典的例子 你可以看到&#xff0c;我们的环境变量是一个经典的List列表&#xff0c;其中承载的就是我们的字符串。我们现在来仿照着搞一个&#xff1a; Ui文件设计如下&#xff1a; 我们下面来逐一演示用…

【简信CRM-注册安全分析报告】

前言 由于网站注册入口容易被黑客攻击&#xff0c;存在如下安全问题&#xff1a; 暴力破解密码&#xff0c;造成用户信息泄露短信盗刷的安全问题&#xff0c;影响业务及导致用户投诉带来经济损失&#xff0c;尤其是后付费客户&#xff0c;风险巨大&#xff0c;造成亏损无底洞…

Python 三维图表绘制指南

Python 三维图表绘制指南 在数据可视化中&#xff0c;三维图表可以更直观地展示数据之间的关系&#xff0c;尤其是当数据具有多个维度时。Python 提供了多个库来绘制三维图表&#xff0c;其中最常用的就是 Matplotlib。本文将介绍如何使用 Matplotlib 绘制三维图表&#xff0c…

粒子群优化双向深度学习!PSO-BiTCN-BiGRU-Attention多输入单输出回归预测

粒子群优化双向深度学习&#xff01;PSO-BiTCN-BiGRU-Attention多输入单输出回归预测 目录 粒子群优化双向深度学习&#xff01;PSO-BiTCN-BiGRU-Attention多输入单输出回归预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.Matlab实现PSO-BiTCN-BiGRU-Attention粒子…

智能离线语音识别不灵敏?如何改善和提升识别率?

前言 有用户反馈离线语音识别不灵敏&#xff0c;跟着笔者一起分析原因吧。笔者知识能力有限&#xff0c;难免会误&#xff0c;还请大家批评指正。 1 影响离线语音识别的因素 笔者分析离线语音识别不灵敏的原因有以下几点 1.1 运行硬件的算力限制 由于离线语音识别在本地MCU…