【环境变量】命令行参数 | 概念 | 理解 | 命令行参数表 | 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.hqwc.cn/news/589971.html

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

相关文章

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

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

[学习笔记]pytorch tutorial

pytorch tutorial 1.Installation2.Tensor Basics3.Gradient Calculation With Autograd4.Back propagation5.6 Gradient Descent with Autograd and Back propagation & Train Pipeline Model, Loss, and Optimizer第一步&#xff1a;纯手写第二步&#xff1a;梯度计算使用…

镜舟科技荣获第十三届中国智能制造高峰论坛两项大奖

2024年3月29日&#xff0c;由e-works数字化企业网和湖北省中小企业服务中心联合主办&#xff0c;中国中小企业发展促进中心指导的“第十三届中国智能制造高峰论坛暨第二十一届中国智能制造岁末盘点颁奖典礼”在北京圆满落幕。本次论坛汇聚了国内外智能制造领域的专家学者、企业…

产品推荐 | 基于VIRTEX UltraScale+系列的 FACE-VU3P-B高性能FPGA开发平台

01、产品概述 FACE-VU3P-B高性能FPGA开发平台是FACE系列的新产品。FACE-VU3P-B搭载有16nm工艺的VIRTEX UltraScale系列主器件XCVU3P。该主器件具有丰富的FPGA可编程逻辑资源&#xff0c;其资源量高于常用的V7-690器件&#xff0c;并且其性能远远高于V7-690器件。 平台板载有丰…

华为ICT七力助推文化产业新质生产力发展

创新起主导作用的新质生产力由新劳动者、新劳动对象、新劳动工具、新基础设施等四大要素共同构成&#xff0c;符合新发展理念的先进生产力质态&#xff1b;具有高科技、高能效、高质量等三大突出特征。而通过壮大新产业、打造新模式、激发新动能&#xff0c;新质生产力能够摆脱…

5.5G,只比6G少0.5G

5.5G成为通信行业2024年开年的一大焦点。提到5.5G&#xff0c;多出来的0.5G又是啥&#xff1f;为什么不直接迈向6G时代&#xff1f;今天我们一探究竟&#xff01; “0.5G”&#xff0c;现在与未来的桥梁 2021年&#xff0c;国际标准组织3GPP为通信技术的进一步发展定义了新的里…

2024最新AI创作系统ChatGPT源码+Ai绘画网站源码,GPTs应用、AI换脸、插件系统、GPT文档分析、GPT语音对话一站式解决方案

一、前言 SparkAi创作系统是基于ChatGPT进行开发的Ai智能问答系统和Midjourney绘画系统&#xff0c;支持OpenAI-GPT全模型国内AI全模型。本期针对源码系统整体测试下来非常完美&#xff0c;那么如何搭建部署AI创作ChatGPT&#xff1f;小编这里写一个详细图文教程吧。已支持GPT…

redis 集群 (主从复制 哨兵模式 cluster)

目录 一 主从复制 &#xff08;一&#xff09;相关理论 1&#xff0c;主从复制定义 2&#xff0c;主从复制的作用 3&#xff0c;主从复制架构图 4 sync 同步过程 5&#xff0c;主从复制流程 &#xff08;二&#xff09; 实验模拟 1&#xff0c; 实验环境 2, 修…

Ruby 之交租阶段信息生成

题目 我看了一下&#xff0c;这个题目应该不是什么机密&#xff0c;所以先放上来了。大概意思是根据合同信息生成交租阶段信息。 解答 要求是要使用 Ruby 生成交租阶段信息&#xff0c;由于时间比较仓促&#xff0c;变量名那些就用得随意了些。要点主要有下面这些&#xff1a…

Flutter应用在苹果商店上架后的推广与运营策略分享

引言 Flutter是一款由Google推出的跨平台移动应用开发框架&#xff0c;其强大的性能和流畅的用户体验使其备受开发者青睐。然而&#xff0c;开发一款应用只是第一步&#xff0c;将其成功上架到苹果商店才是实现商业目标的关键一步。本文将详细介绍如何使用Flutter将应用程序上…

Ubuntu20.04使用Neo4j导入CSV数据可视化知识图谱

1.安装JDK&#xff08; Ubuntu20.04 JDK11&#xff09; sudo apt-get install openjdk-11-jdk -y java -version which java ls -l /usr/bin/java ls -l /etc/alternatives/java ls -l /usr/lib/jvm/java-11-openjdk-amd64/bin/java确认安装路径为/usr/lib/jvm/java-11-openjd…

神经网络与深度学习(二)

一、深度学习平台 张量&#xff08;Tensor&#xff09; 是一个物理量&#xff0c;对高维(维数 ≥ 2) 的物理量进行“量纲分析” 的一种工具。简单的可以理解为&#xff1a;一维数组称为矢量&#xff0c;二维数组为二阶张量&#xff0c;三维数组为三阶张量 计算图 用“结点”…