当前位置: 首页 > news >正文

【Linux】进程(5):命令行参数

大家好,我是苏貝,本篇博客带大家了解Linux进程(5):命令行参数,如果你觉得我写的还不错的话,可以给我一个赞👍吗,感谢❤️
在这里插入图片描述


目录

  • (A)为什么要有命令行参数
  • (B)谁将命令行参数传递

在我们学习C语言的时候,我们的main函数都是不带参数的,其实main函数也可以带参数
在这里插入图片描述

这两个参数的意义是什么?
argc是int类型的,它表示的是命令行参数的个数(不需要用户传递,它会根据用户从命令行输入的参数个数自动确定)
第二个参数明显是指针数组,每个元素的类型是char*,这说明每个元素指向的要不是字符,要不是一个字符串,它的作用是存储用户从命令行输入进来的参数。

让我们通过代码来详细了解一下

先写.c文件
在这里插入图片描述

执行下面的程序
在这里插入图片描述

第一个只输入./myprocess,所以argc为1
第二个输入./myprocess和-a,它们以空格分隔,所以argc为2
第三个的grgc为3……

根据上面的代码,我们能够感觉到,数组argv是个变长数组,最后一个元素指向NULL,argc是数组的非NULL元素个数,我们以./myprocess -a -b -c为例
在这里插入图片描述

我们上面说过,./myprocess -a -b -c是命令行字符串,也是命令行参数。在我们命令行输入的时候,Linux中会有一些内部的功能将输入的整体的字符串打散成4个字符串:./myprocess ,-a,-b和-c(它们之间以空格作为分隔符)。然后让数组argv的元素分别指向它们,最后以参数的形式传递给main函数
在这里插入图片描述

Linux是如何实现将一整个字符串打散成多个字符串的呢?其实就只需要将分隔符(空格)全部设置为‘\0’即可

现在来证明一下数组argv最后一个元素是NULL

修改.c文件,如果argv最后一个元素是NULL,也就是0,那么循环会停下来。
在这里插入图片描述
在这里插入图片描述

进程不会死循环,所以argv最后一个元素是NULL

(A)为什么要有命令行参数

了解了命令行参数后,我们来思考一个问题:为什么要有命令行参数?
命令行参数的本质:交给程序不同的选项,用来制定不同的程序功能。比如:ls -a和ls -l中因为选项不同,功能就不同。我们再自己写一个有不同选项的程序

修改.c文件

在这里插入图片描述

上面代码的意思:当命令行参数不等于2时,会提醒输入./myprocess和-[a,b,c,d]中任意一个选项。当等于2时,对每一个选项都会打印出不同的语句
在这里插入图片描述

(B)谁将命令行参数传递

修改.c文件,其中,g_val是全局变量
在这里插入图片描述

在这里插入图片描述

根据结果,我们知道,父进程的数据g_val,默认能被子进程看到并访问

通过前面的学习,我们知道,命令行中启动的程序,都会变成进程,且都是bash的子进程
命令行参数默认是输入给父进程bash的,bash再命令行解释,将命令行参数变成main函数的2个参数。所以,是bash传递命令行参数

又父进程的数据,默认能被子进程看到并访问,所以子进程能看到这张表

在这里插入图片描述


好了,那么本篇博客就到此结束了,如果你觉得本篇博客对你有些帮助,可以给个大大的赞👍吗,感谢看到这里,我们下篇博客见❤️

http://www.lryc.cn/news/362920.html

相关文章:

  • vue2+antv/x6实现er图
  • 如何在XDMA中查看LTSSM状态机
  • 编译和运行qemu-uboot-arm64单板的Armbian系统
  • Python版《消消乐》,附源码
  • Kubernetes ingress
  • 【JavaScript】ECMAS6(ES6)新特性概览(二):解构赋值、扩展与收集、class类全面解析
  • Linux入门学习指南
  • 纯血鸿蒙实战开发—如何添加顶部tab页面
  • 数仓建模—指标拆解和选取
  • HTML静态网页成品作业(HTML+CSS)——VIVO介绍网页(1个页面)
  • MySQL(四) - SQL优化
  • 用 DataGridView 控件显示数据
  • VisualSVN Server/TortoiseSVN更改端口号
  • 如何解决研发数据传输层面安全可控、可追溯的共性需求?
  • 表 ,索引的 degree 检查, trim(degree) default INSTANCES
  • Git - Rebase命令介绍
  • JavaScript 从入门到精通Object(对象)
  • Postgresql中json和jsonb类型区别
  • 太强了,使用 C# 开发的开源内网穿透工具
  • leetcode及牛客网二叉树相关题、单值二叉树、相同的树、二叉树的前序、中序、后序遍历、另一棵树的子树、二叉树的遍历、 对称二叉树等的介绍
  • Spring (38)Spring Cloud
  • MySQL之数据库相关操作学习笔记(一)
  • 【Node】node的Events模块(事件模块)的介绍和使用
  • C#中字节数组(byte[])末尾继续添加字节的示例
  • Socket编程学习笔记之TCP与UDP
  • JavaScript第九讲BOM编程的练习题
  • JavaScript 中创建函数的多种方式
  • 对称二叉树[简单]
  • 判断GIF类型并使用ImageDecoder解析GIF图
  • 数组对象数据修改后页面没有更新,无法进行编辑,校验失效问题