【环境变量】命令行参数 | 概念 | 理解 | 命令行参数表 | bash进程

目录

四组概念

命令行参数概念&理解

查看命令函参数 

命令行字符串&命令行参数表

命令行参数存在的意义

谁形成的命令行参数

父进程&子进程&数据段

bash进程


最近有点小忙,可能更新比较慢。

四组概念

  • 竞争性: 系统进程数目众多,而CPU资源只有少量,甚至1个,所以进程之间是具有竞争属性的。为了高效完成任务,更合理竞争相关资源,便具有了优先级。
  • 独立性: 多进程运行,需要独享各种资源,多进程运行期间互不干扰。
  • 并行: 多个进程在多个CPU下分别,同时进行运行,这称之为并行。
  • 并发: 多个进程在一个CPU下采用进程切换的方式,在一段时间之内,让多个进程都得以推进,称之为并发。

并发:在特点的时间范围内,一个CPU调度进程,多进程以上下文切换的方式保证进程同时得以推进。

用户层出现卡顿的情况❓

回答:在运行队列中排队的进程很多,CPU切换的负担过重,出现进程被再次调度的时间很长,或者长时间不被调度的情况,出现进程的卡顿,也就是用户层出现卡顿的情况。


并行:并行的同时存在并发。并发切换速度非常快,用户层感知不到的。并发的历史价值是指多个CPU能让多个进程同时运行,既便宜又能满足用户的需求。(软件技术带来的意义)


独立性(地址空间细讲):任务启动变成进程,多进程运行,进程和进程之间是不影响的。数据的独立(全局/局部,but全局变量可以被子进程看到,局部不可以)


竞争性:硬件资源优先(只有一套),进程是非常多的,进程通过访问硬件来达到自己的任务目的,进程在资源本质上天然就是具有竞争性的。

命令行参数概念&理解

main()函数可以接收参数,这些参数是什么❓表示的什么意义❓ 为什么存在❓

  • main函数的参数可带参数,也可以不带参数(这里讨论带参的)
  • int main ( int argc, char *argv[ ] )
  • 参数 int argc, char *argv[ ]
  • 参数就是命令行参数的形式参数;命令行中输入的是实际参数
  • int argc 表示指针数组中元素的个数有多少(c count)
  • char *argv 表示指针数组(数组中每个元素都是char *类型的元素)
  • >>>>>>char *类型的指针
  1. 指向某个字符的地址
  2. 指向某个字符串的起始地址
  • 在char *argv[ ]中char *类型的元素通常是指向字符串的起始地址的
  • char *argv[ ]的最后一个指针必须指向NULL
  • argc 是不包括NULL的个数的
  • 命令行输入的参数会存在程序

综下总结:命令行参数是C语言提供的一种可以 以main函数传参的方式 支持用户去实现一些可变选项的一些程序 的方式。(同一个程序以不同选项实现不同功能)

查看命令函参数 

编译运行我们发现

  • argc中的元素就是命令行中输入的是参数,即命令行参数
  • argc是根据命令行输入的参数变动的大小的
  • argc 是不包括NULL的个数的
  • char *argv[ ] 是变长数组
  • 命令行输入的参数会存在程序(自己的程序a.out 或者 系统的指令程序)和程序匹配的选项
#include<stdio.h>
#include<unistd.h>
int main(int argc,char *argv[])
{for(int i = 0;i < argc;i++){printf("argv[%d]->%s\n",i,argv[i]);}return 0;
}

命令行字符串&命令行参数表

  • 整体:命令行字符串
  • 局部:程序的路径&名称 + 和该进程匹配的选项(或者只有程序的路径&名称)
  • 程序:分为用户自己写的程序&选项  和 系统的程序&选项
  1. 用户在命令行输入的参数整体是一个命令行字符串。
  2. 由OS中的进程/模块负责以空格为分割线分割成1个1个字符串(把字符串变成"\0")。
  3. OS中的进程/模块 把这些字符串的地址传给argv数组,形成命令行参数表,argv中的元素都指向这些字符串。
  4. 再以参数的形式传给子进程的main函数。
  5. 命令行参数表前面都是有效字符串的地址,最后必须以NULL收尾。

【自己程序&选项】

【系统程序&选项】

【验证argc以NULL收尾】

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

【命令行参数表】

命令行参数存在的意义

 为什么要这么干❓main函数存在的意义❓

回答:通过给同一个可执行程序带上不同的选项,从而实现让同一个程序根据不同的选项执行不同的功能。

  • 不同的选项 ≈ 不同的子功能 ≈  argc >= 2
  • argc是多少,argv数组就有多少个元素(不包括NULL)
  • 命令行参数本质是交给我们程序的不同的选项,用来定制不同的程序功能。命令中会携带很多的选项。
#include<unistd.h>
#include<stdlib.h>
int main(int argc, char *argv[])
{if(argc != 2){printf("Usage: %s -[a,b,c,d]\n", argv[0]);return 1;}if(strcmp(argv[1], "-a") == 0){printf("this is function1\n");}else if(strcmp(argv[1], "-b") == 0){printf("this is function2\n");}else if(strcmp(argv[1], "-c") == 0){printf("this is function3\n");}else if(strcmp(argv[1], "-d") == 0){printf("this is function4\n");}else{printf("no this function!!\n");}return 0;
}

 

谁形成的命令行参数

到底是谁这么干的❓

回答:bash进程。 

父进程&子进程&数据段

看到下面代码执行的结果,我们发现:子进程是可以拿到父进程的数据(无论是局部变量还是全局变量) 。无论是父进程还是子进程运行时都可以看到1000和7。

  • 父进程的数据默认能被子进程看到并访问。(访问 ≠ 子进程不能修改)
  • 我们发现父进程的pid一直在变化,但是ppid没有改变,一直都是2836
  • 2836是谁❓就是命令行解释器☞bash进程
#include<string.h>
#include<unistd.h>
int g_val = 100000;int main()
{int key=7;printf("I am father process, pid: %d, ppid: %d, g_val: %d\n", getpid(), getppid(), g_val);sleep(5);pid_t id = fork();if(id == 0){//childwhile(1){printf("I am child process, pid: %d, ppid: %d, g_val: %d,key=%d\n", getpid(), getppid(), g_val,key);sleep(1);}}else{// fatherwhile(1){printf("I am father process, pid: %d, ppid: %d, g_val: %d\n", getpid(), getppid(), g_val);sleep(1);}}
}

bash进程

  • OS启动的时候都会启动一个进程☞bash进程
  • 命令行中无论是启动自己的程序,还是系统程序。都会变成进程,起始都是bash的子进程。
  • 命令行中输入的参数默认是输入给bash进程的获取的。
  • 注意❗:系统指令程序和自己程序启动运行都是一样,并没有任何差别(唯一差别启动时,带与否路径,下篇环境变量讲)
  • bash进程获取到了参数
  1. 创建子进程
  2. 形成命令行参数表
  3. 把参数传参给子进程的main函数
  4. 或者父进程的命令行参数表(数据段)是可以被子进程共享的

  • bash进程把命令行参数表传给子进程两种方式
  1. 传参
  2. 父进程的命令行参数表(数据段)是可以被子进程共享的

流程

  • 登录Linux系统
  • 创建bash进程
  • 在命令行中输入参数
  • bash进程获取参数的路径&可执行程序(怎么获取❓下篇)
  • 创建子进程
  • bash并把【命令行参数表】传给子进程main函数(传参 / 共享)
  • 子进程接着执行自己的代码 

🙂感谢大家的阅读,若有错误和不足,欢迎指正。

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

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

相关文章

构建企业级微服务平台:实现可扩展性、弹性和高效性

在软件开发的快速发展领域中&#xff0c;企业不断努力构建健壮、可扩展和高效的系统。随着微服务架构的出现&#xff0c;再加上云原生技术的应用&#xff0c;创建敏捷且具有弹性的平台的可能性是无限的。在本指南中&#xff0c;我们将深入探讨使用强大的工具和技术组合&#xf…

Python基于深度学习的人脸识别项目源码+演示视频,利用OpenCV进行人脸检测与识别 preview

​ 一、原理介绍 该人脸识别实例是一个基于深度学习和计算机视觉技术的应用&#xff0c;主要利用OpenCV和Python作为开发工具。系统采用了一系列算法和技术&#xff0c;其中包括以下几个关键步骤&#xff1a; 图像预处理&#xff1a;首先&#xff0c;对输入图像进行预处理&am…

.Net Core/.Net6/.Net8 ,启动配置/Program.cs 配置

.Net Core/.Net6/.Net8 &#xff0c;启动配置/Program.cs 配置 没有废话&#xff0c;直接上代码调用 没有废话&#xff0c;直接上代码 /// <summary>/// 启动类/// </summary>public static class Mains{static IServiceCollection _services;static IMvcBuilder _…

Debian linux版本下运行的openmediavault网盘 千兆网卡升级万兆

一、适用场景 1、使用vmware ESXi虚拟化平台运行多种不同应用服务器时&#xff0c;其中网盘服务器采用开源的openmediavault搭建&#xff1b; 2、将老专业服务器升级千兆网为万兆网&#xff1b; 3、需要转移的数据量大的企业或用户&#xff1b; 4、从服务器到服务器的数据转移…

【群晖】NASTOOL-自动化处理影音视频工具

【群晖】NASTOOL-自动化处理影音视频 本文主要从获取、部署、使用、配置等方面进行手把手教学如何使用nastool工具进行影音视频自动化处理。从此靠别繁琐的网上各个网址找资源-下载-复制-改名-刮削等操作。 准备 DSM 7.1 &#xff08;我使用的是群晖 7.1 系统&#xff0c;不管…

实战webSocket压测(二)jmeter配置webSocket连接

背景 我们可以通过Jmeter添加插件实现webSocket脚本编写。WebSocket的插件较多&#xff0c;我选择以WebSocket Samplers by Peter Doornbosch为例来进行配置。 步骤1、WebSocket Samplers插件安装 下载地址&#xff1a;JMeter WebSocket Samplers&#xff0c;建议下载最新版本…

Termius for Mac v8.4.0激活版下载

Termius for Mac是一款功能强大的多协议远程管理软件&#xff0c;专为开发人员、系统管理员和网络专业人士设计。它支持多种远程连接协议&#xff0c;如SSH、Telnet、RDP、VNC和RFB等&#xff0c;使得用户可以轻松连接到不同类型的远程服务器和设备。 软件下载&#xff1a;Term…

智慧展览馆:基于AI智能识别技术的视频智慧监管解决方案

一、建设背景 随着科技的不断进步和社会安全需求的日益增长&#xff0c;展览馆作为展示文化、艺术和科技成果的重要场所&#xff0c;其安全监控系统的智能化升级已成为当务之急。为此&#xff0c;旭帆科技&#xff08;TSINGSEE青犀&#xff09;基于视频智能分析技术推出了展览馆…

[C++初阶]初识C++(一)—————命名空间和缺省函数

声明: 本篇文献内容选自百度文库、比特就业课 代码内容部分选自比特就业课 一、命名空间 1.什么是命名空间 在编程语言中&#xff0c;命名空间是一种特殊的作用域&#xff0c;它包含了处于该作用域中的所有标示符&#xff0c;而且其本身也是由标示符表示的。命名空间的使用目…

STM32的定时器中断Cubemx

STM32的定时器中断Cubemx 0.定时器简介1.配置时钟2.配置定时器3.创建工程4.补充源码 0.定时器简介 基本定时器功能&#xff1a; 16位向上、向下、向上/下自动装载计数器16位可编程(可以实时修改)预分频器&#xff0c;计数器时钟频率的分频系数为1&#xff5e;65535之间的任意…

vue2源码解析——vue中如何进行依赖收集、响应式原理

vue每个组件实例vm都有一个渲染watcher。每个响应式对象的属性key都有一个dep对象。所谓的依赖收集&#xff0c;就是让每个属性记住它依赖的watcher。但是属性可能用在多个模板里&#xff0c;所以&#xff0c;一个属性可能对应多个watcher。因此&#xff0c;在vue2中&#xff0…

Java基础 - 10 - File、IO流(一)

File&#xff1a;代表文本 IO流&#xff1a;读写数据 一. File File是java.io.包下的类&#xff0c;File类的对象&#xff0c;用于代表当前操作系统的文件&#xff08;可以是文件或文件夹&#xff09; 注意&#xff1a;File类只能对文件本身进行操作&#xff0c;不能读写文件里…

MyBatis动态SQL--if 标签

mybatis动态sql对我们来说是非常常见的&#xff0c;比如在下面这样一个场景中&#xff0c; 我们需要多条件查询&#xff0c;但是查询的条件又不是固定的&#xff0c;是可以动态改变的&#xff0c;那我们就需要用到动态sql去完成。 动态SQL之 if 标签 接下来我们介绍第一个动态…

Day43 动态规划 part05

Day43 动态规划 part05 1049.最后一块石头的重量II 我的思路: 提示说和划分两个和相等的子集差不多&#xff0c;猛然想到&#xff0c;这道题不就是划分子集&#xff0c;用sum - 和最大*2 代码就是划分和相同的子集的变形 解答&#xff1a; class Solution {public int last…

【JavaScript】函数 ⑥ ( 使用 arguments 获取所有实参 | arguments 内置对象 | 伪数组概念 )

文章目录 一、使用 arguments 获取所有实参1、arguments 内置对象2、伪数组概念3、arguments 实参遍历4、arguments 代码示例 - 基本使用5、arguments 代码示例 - 遍历实参 一、使用 arguments 获取所有实参 1、arguments 内置对象 在 定义 JavaScript 函数 时 , 有时 不确定 形…

使用LangChain编写图检索查询实现RAG

大家好&#xff0c;检索增强生成&#xff08;Retrieval-Augmented Generation&#xff0c;简称RAG&#xff09;是一种先进的人工智能技术&#xff0c;通过整合大型语言模型&#xff08;LLM&#xff09;的内部知识和外部权威数据源&#xff0c;来提升生成式AI模型的表现。 本文…

安全可靠!麒麟信安操作系统各版本均不受liblzma/xz漏洞影响!

近日&#xff0c;XZ Utils 5.6.0和5.6.1版本存在严重后门风险的消息披露后&#xff0c;麒麟信安立即展开全面排查&#xff0c;经分析验证&#xff0c;麒麟信安操作系统各版本均不受liblzma/xz漏洞影响。 关于liblzma/xz漏洞 漏洞描述 xz 5.6.0 与 5.6.1 版本的上游代码中发现…

ComplexHeatmap绘图:注释、图例、热图基础(自备)

目录 基础介绍 Heatmap绘图基础参数 数据 作图参数 Heatmap Annotations&#xff08;注释&#xff09; 基础注释设置 简单注释测试 anno_points散点注释 anno_lines连线注释 anno_barplot条形图 anno_boxplot箱线图 anno_histogram直方图 热图组合 基础组合 进行…

【热门话题】文言一心与ChatGPT-4:一场跨时代智能对话系统的深度比较

&#x1f308;个人主页: 鑫宝Code &#x1f525;热门专栏: 闲话杂谈&#xff5c; 炫酷HTML | JavaScript基础 ​&#x1f4ab;个人格言: "如无必要&#xff0c;勿增实体" 文章目录 文言一心与ChatGPT-4&#xff1a;一场跨时代智能对话系统的深度比较一、技术背景…

Maven--lib分离的打包方式

就是把lib包和source源码分开打包。优势就是&#xff0c;面对频繁更新的应用场景时&#xff0c;可以只更新源码包&#xff08;当然&#xff0c;前提是你的依赖没有增减&#xff09;。尤其是使用jenkins更新项目时&#xff0c;会省去很多时间吧&#xff1f; 不同项目的 lib之间不…