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

news2024/11/27 2:16:33

命令行参数:
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是父进程的值,因此会发生写时拷贝,写时拷贝会导致好像同一个变量有不同的值。

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

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

相关文章

持续优化,构建更好地 auto git commit 体验

几个月前&#xff0c;受到一篇推文的启发 https://x.com/mtrainier2020/status/1802941902964277379 &#xff0c;我突然想到可以借助 git alias 添加一些小命令&#xff0c;加速我的 git workflow 流程&#xff0c;于是我花了两个小时的时间进行工程封装&#xff0c;并发布了 …

C#-类:声明类、声明类对象

一&#xff1a;类的声明 class 类名 {//特征——成员变量//行为——成员方法//保护特征——成员属性//构造函数和析构函数//索引器//运算符重载//静态成员 }类名&#xff1a;帕斯卡 同一个语句块中的不同类 不能重名 二&#xff1a;声明类对象 2.1 类的声明 ≠ 类对象的声…

【学习enable_if模板, 学习unqiue_str 删除操作】

enable_if 是 C 标准库中的一个模板结构体&#xff0c;它用于条件编译和 SFINAE&#xff08;Substitution Failure Is Not An Error&#xff09;。enable_if 的主要作用是通过条件编译来控制模板的实例化&#xff0c;从而实现条件编译和 SFINAE。 1. enable_if 的基本用法如下…

AIGC产品经理高频面试题❗️看完的都拿高薪了

&#x1f914;️如果你正在考虑找AI产品经理相关的工作, 建议好好准备这些面试问题, 如果想要更加详细的回答可以直接询问海螺AI哦! 谁用了不说一句: AI真的太适合准备面试啦(&#x1f640;尖叫抛开 之后会分享更多岗位的面试题目, 以及如何用AI准备面试的tips哦! 大模型&A…

【VS+QT】联合开发踩坑记录

最新更新日期&#xff1a;2024/11/05 0. 写在前面 因为目前在做自动化产线集成软件开发相关的工作&#xff0c;需要用到QT&#xff0c;所以选择了VS联合开发&#xff0c;方便调试。学习QT的过程中也踩了很多坑&#xff0c;在此记录一下&#xff0c;提供给各位参考。 1. 环境配…

Windows下安装Maven并配置环境

在Windows下安装Maven、修改阿里云仓库、修改本地仓库路径&#xff0c;并为IntelliJ IDEA配置Maven&#xff0c;可以按照以下步骤进行操作&#xff1a; 1. 安装Maven 下载Maven&#xff1a; 访问 Apache Maven官网&#xff0c;下载最新版本的Maven二进制包&#xff08;zip格式…

基于SpringBoot+微信小程序+协同过滤算法+二维码订单位置跟踪的农产品销售平台-新

✌全网粉丝20W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取项目下载方式&#x1f345; 一、项目背景介绍&#xff1a; “农产品商城”小程序…

【题】C#-数组:二维数组

1. 将1~10000赋值给一个二维数组(100行100列) int[,] array new int[100,100]; int index 1; for(int i 0;i < array.GetLength(0);i){for(int j 0;j < array.GetLength(1);j){array[i,j] index;index;} }2. 将二维数组的右上半部分置零 int[,] array new int[4,…

启明云端乐鑫一级代理商,ESP-NOW无线通信协议,设备稳定连接控制新选择

在数字化浪潮的推动下&#xff0c;我们正步入一个由智能设备构成的全新世界。这些设备&#xff0c;从智能手机到智能家居&#xff0c;从可穿戴设备到工业自动化系统&#xff0c;都在以前所未有的速度改变着我们的生活。 在物联网(IoT)的世界里&#xff0c;无线通信协议扮演着至…

基于SpringBoot的植物园管理小程序【附源码】

基于SpringBoot的植物园管理小程序 效果如下&#xff1a; 系统登录页面 管理员主页面 商品订单管理页面 植物园信息管理页面 小程序主页面 小程序登录页面 植物信息查询推荐页面 研究背景 随着互联网技术的快速发展和移动设备的普及&#xff0c;线上管理已经成为各行各业提高…

如何使用Web-Check和cpolar实现安全的远程网站监测与管理

文章目录 前言1.关于Web-Check2.功能特点3.安装Docker4.创建并启动Web-Check容器5.本地访问测试6.公网远程访问本地Web-Check7.内网穿透工具安装8.创建远程连接公网地址9.使用固定公网地址远程访问 前言 本期给大家分享一个网站检测工具Web-Check&#xff0c;能帮你全面了解网…

数据中台一键大解析!

自从互联玩企业掀起了数据中台风&#xff0c;数据中台这个点马上就火起来了&#xff0c;短短几年数据中台就得到了极高的热度&#xff0c;一大堆企业也在跟风做数据中台&#xff0c;都把数据中台作为企业数字化转型的救命稻草&#xff0c;可是如果我告诉你数据中台并不是万能钥…

华为和思科的配置

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

【Linux】从零开始使用多路转接IO --- epoll

当你偶尔发现语言变得无力时&#xff0c; 不妨安静下来&#xff0c; 让沉默替你发声。 --- 里则林 --- 从零开始认识多路转接 1 epoll的作用和定位2 epoll 的接口3 epoll工作原理4 实现epollserverV1 1 epoll的作用和定位 之前提过的多路转接方案select和poll 都有致命缺点…

电子商城购物平台的设计与开发+ssm(lw+演示+源码+运行)

摘 要 随着我国经济迅速发展&#xff0c;人们对手机的需求越来越大&#xff0c;各种手机软件也都在被广泛应用&#xff0c;但是对于手机进行数据信息管理&#xff0c;对于手机的各种软件也是备受用户的喜爱&#xff0c;电子商城购物平台小程序被用户普遍使用&#xff0c;为方便…

5G时代已来:我们该如何迎接超高速网络?

内容概要 随着5G技术的普及&#xff0c;我们的生活似乎变得更加“科幻”了。想象一下&#xff0c;未来的智能家居将不仅仅是能够听你说“开灯”&#xff1b;它们可能会主动询问你今天心情如何&#xff0c;甚至会推荐你一杯“维他命C芒果榨汁”&#xff0c;帮助你抵御夏天的炎热…

超详细的finalshell安装nginx

一、nginx环境安装 1.安装gcc 安装nginx需要先将官网下载的源码进行编译&#xff0c;编译依赖gcc环境&#xff0c;如果没有gcc环境&#xff0c;需要安装gcc。 yum install gcc-c 出现选择是否下载安装文件&#xff0c;输入 y 2.安装PCRE PCRE(Perl Compatible Regular Expre…

运维工具之docker入门

1.容器与docker 1.什么是容器&#xff1f; 容器是一种轻量级的&#xff0c;可移植的软件运行环境。它将软件程序本身及软件依赖库打包在一起。可以在不同平台和系统上运行。 2.什么是LXC LXC就是Linux container,。LXC是一种虚拟化技术&#xff0c;可以在操作系统层级上为应…

【华为HCIP实战课程二十九】中间到中间系统协议IS-IS邻居关系建立和LSP详解,网络工程师

一、广播环境邻居关系建立详解 1、广播环境邻居关系建立 广播邻居关系采用三次握手,携带的邻居列表为接口的MAC来标识 2、LSP同步:3种报文(CSNP和PSNP和具体的LSP) CSNP作用类似DBD,请求者发送PSNP(类似LSR)来请求具体的LSP 广播网络LSP交互过程: R1-R2(DIS)--R3…

计算机网络:网络层 —— 网络地址转换 NAT

文章目录 网络地址转换 NAT 概述最基本的 NAT 方法NAT 转换表的作用 网络地址与端口号转换 NAPTNAT 和 NAPT 的缺陷 网络地址转换 NAT 概述 尽管因特网采用了无分类编址方法来减缓 IPv4 地址空间耗尽的速度&#xff0c;但由于因特网用户数量的急剧增长&#xff0c;特别是大量小…