目录
0.背景
1.主函数的参数的几种类型
2.只有两个参数的主函数
3.使用命令行参数实现一个任务
3.1任务的说明
3.2任务的实现
4.拥有三个参数的主函数
4.1环境变量的解释
4.2参数说明
0.背景
之前学习这个linux的管道的时候,老师上课就讲到了linux系统编程这个管道的时候,main函数里面的这个命令行参数,当时我只是去找了一篇博客学习了一下,但是也只是一知半解,今天是真的系统学习了一下;
1.主函数的参数的几种类型
上面是是我们的main函数的几个形式,其中这个里面的第一个形式是我们初学的时候经常使用的一个形式,也是我们大部分情况下使用的一个情况;
第二个是包含了两个参数的类型,其中第一个参数就是一个int类型的argc变量,这个变量表示的就是我们的这个命令行参数的个数(下面会使用具体的案例进行详细的说明),第二个就是每一个命令行的参数的具体的内容;
第三个是具有三个参数的主函数,其中这个第三个参数就是我们的这个env参数,这个参数表示的就是我们的环境变量,下面也会使用实例进行说明的;
2.只有两个参数的主函数
下面的这个代码就可以帮助我们去理解这个main函数里面的两个参数的具体的含义
我们编译之后就会生成对应的a.out文件,这个文件就是可执行的程序,我们直接在这个命令行里面敲入这个./a.out表示的就是运行当前的目录下面的可执行文件;
这个时候,我们的第一个参数的打印结果就是1,第二个参数数组的第一个元素就是我们敲到这个命令行里面的指令;
除此之外,我们可以在运行这个a.out文件的时候加上其他的这个指令,例如加上这个hello world,就会发现这个打印的结果里面的argc就是3,argv对应的就是我们的指令的元素;
由此我们就可以得出一个结论,就是到底什么是命令行参数,我们敲击在这个命令行里面的指令就是命令行参数;
argv对应的就是我们敲击的指令的每一个部分而已;
如果我们想让这个hello world作为一个参数的话,我们只需要在命令里面的时候把这个部分使用引号给引用起来,这个之后再次运行就会发现这个argc和argv里面的元素都是发生了对应的改变的;
3.使用命令行参数实现一个任务
3.1任务的说明
上面介绍了这个命令行参数的相关的基本的知识,接下来我们使用命令行参数完成一个任务,就是只有我们输入这个./bilibili的时候这个程序才会被运行,使用这个./a.out的时候,这个程序不会被运行;
其实这个并不复杂,我们只需要把这个生成的这个可执行程序的这个默认的名字改一下之后再次进行操作就可以了,可能就是在主函数里面需要进行相关的设计;
3.2任务的实现
下面的这个代码里面,我们调用这个strcmop函数,这个函数就是用来对于字符串进行比较的函数,当我们的命令行参数是./bilibili的时候,和我们的这个agrv[0]相同,这个时候函数的返回值是0,这个时候我们的这个程序才会正常的执行;
当这个返回值不是0,说明这个参数和我们的bilibili不一样,这个时候就会打印错误的信息
这个时候,如果我们依然去使用这个./a.out运行的时候,这个时候调用strcmp函数的时候返回值就不是0,因此这个就会打印出来我们优先设置好的错误的信息;
我们只需要在这个linux里面使用mv指令把这个可执行程序名字进行修改,修改为bilibili,这样,我们运行的时候,使用./bilibili的时候就不会有问题了;
使用指令运行,发现这个打印的结果就是argc和argv对应的参数的数值;
4.拥有三个参数的主函数
4.1环境变量的解释
所有需要配置环境变量才可以执行的语言,其实他们的这个解释器都是使用的这个C语言实现的,像这个我们熟悉的python和java底层的解释器,就是用的c语言实现的,利用的就是c语言里面的这个拥有三个参数的主函数,可以读取环境变量的功能;
4.2参数说明
我们定义一个二级指针变量p,当这个指针不是空的时候,我们就会想后继续遍历下去;
下面的这个打印的结果就是我们的环境变量的具体的内容,实际上这个就是和我们的用户或者系统相关的信息:下面的这个logname就是我们的用户的名字的信息;
我们当前的这个用户名是guanghu,我们如何去验证这个环境变量是不是发挥了作用,这个时候,我们可以在这个代码里面进行调整:当这个p[0]不是这个guanghu1的时候,就会直接终止程序执行(break操作),因为我们的这个用户名是guanghu,肯定是不符和这个要求的,因此这个肯定无法运行起来,运行的输出就是提示的错误信息;
后面想要实现正常运行的话,就需要添加新的用户,使用这个adduser之类的东西,把这个程序在guanghu1这个新建的用户里面去运行,这个时候就不会有问题,当然,这都是后话,我们的目的就是为了验证,这个main函数里面的第三个参数也是发挥着作用的,只是我们平时没有经常用到罢了~~