🪐🪐🪐欢迎来到程序员餐厅💫💫💫
主厨的主页:Chef‘s blog
所属专栏:青果大战linux
前几天在搞硬件,所以拖更了,现在基本完成,于是立刻投入了Linux的怀抱
main的参数
我们c语言学习的第一段代码那一定是hello,world,之后我们在此基础之上,不断地学习着。
include<stdio.h>
int main(){
printf("hello,world\n");
}
想必大家都知道main本质也是一个函数,他也像上面那样显示的一样,是个没有形参的函数。
、、、还是说,并不是这样!
某些小伙伴可能见过main下面这种用法
#include<stdio.h>
int main(int argc ,char* argv[]){
printf("%d",argc);
for(int i=0;i<argc;i++)
printf("%s\n",argv[i]);
}
这里出现了两个参数,一个int整型,一个指针数组,而他们就是我们在linux中能够使用命令的关键。
我们对代码进行加工,
#include<stdio.h>
#include<string.h>
int main(int argc ,char* argv[]){
printf("argc:%d\n",argc);
if(argc!=2)
{
printf("格式错误\n");
}
else
{
if(strcmp(argv[1],"-a")==0)
printf("功能a\n");
else if(strcmp(argv[1],"-b")==0)
printf("功能b\n");
else if(strcmp(argv[1],"-c")==0)
printf("功能c\n");
else
{
printf("其他功能\n");
}
}
}
我知道,你很急,但你先别急,马上解惑
在我们像以往一样直接./test1.exe运行文件,输出如下
argc的值是1.并告诉我们格式错误。接着我们像指令一样,加入“-a”“-b”,“-c”选项,输出如下
这时敏锐的朋友就已经意识到了,我们在命令行所使用的命令及其对应的选项,就是用的main函数带参数的方法!
我们在命令行输入一条语句,他会被按照空格进行分割,像上面的“./test1.c -a”,就会被分成两个参数,argc所存储的就是参数的个数,所有参数都会被以字符串的形式从左到右依次放到argc数组中,该数组最后一个元素是NULL,所以也可以这么写
#include<stdio.h>
int main(int argc,char*argv[]){
printf("argc:%d\n",argc);
int i=0;
while(argv[i])
{
printf("%s\n",argv[i++]);
}
}
在此基础之上,我们不禁好奇,分割这个字符串的是谁呢,显然他不是该可执行程序,因为这段代码从main函数才开始运行,但是分割字符串是发生在调用main之前的(不然没法传参)
要知道我们在命令行所启动的程序,不论是指令也好,是自己写的代码也罢,他们的父进程是唯一且确定的,即shell,他们互为父子进程,因此我们不难推测就是bash分割了字符串,接着以main函数传参的方式把数据传给了我们的test3.exe,至于具体怎么操作的,我们以后再说
我叮嘱一下,这个main函数的参数不是说一定要写为argc和argv,只是我们普遍这样写,你要是非要写成int a和char*b[]也是没问题的。
环境变量
事实上,main函数有三个参数,第三个就是环境变量,我们来展示一下
#include<stdio.h>
int main(int argc,char*argv[],char*env[]){
int i=0;
while(env[i])
{
printf("%s\n",env[i++]);
}
}
我们一运行文件,就打印出一大堆字符串,他们就是环境变量。
环境变量的概念
环境变量(environment variables)一般是指在操作系统中用来指定操作系统运行环境的一些参数
我们来讲解几个常见的环境变量
- PATH : 指定命令的搜索路径
- HOME : 指定用户的主工作目录(即用户登陆到Linux系统中时,默认的目录)
- SHELL : 当前Shell的路径,它的值通常是/bin/bash。
- USER:当前正在使用系统的用户是谁
- HOME:当前用户的家目录在哪
- PWD:当前路径
关于PATH
我们在使用指令时直接输入指令名称和选项即可,但是在运行自己写的可执行文件时,需要在他前面加上相对路径或者绝对路径。这就是PATH的作用,PATH是多个路径拼接而成的字符串由“:”作为分隔符,在运行可执行文件时,如果没有带路径,会先在PATH中查找,看该文件是否在这些路径中,如果有就可以运行,如果没有则相当于找不到该可执行文件,就无法执行。而指令的绝对路径包含在PATH中,因此可以不待路径直接运行。
查看环境变量
- echo$+名称
- getenv查看环境变量
输入一个环境变量名,他会返回该环境变量的值,包含在stdlib.h中
注意不可以查看本地变量
#include<stdio.h>
#include<stdlib.h>
int main(){
printf("%s\n",getenv("PATH"));
printf("%s\n",getenv("a"));
}
- 指针数组
enviorn,是一个外部变量,这是c语言提供的,我们直接加extern声明即可
#include<stdio.h>
#include<unistd.h>
extern char**environ;
int main(){
int i=0;
while(environ[i])
printf("%s\n",environ[i++]);
}
- env指令
显示所有环境变量
- set指令
显示所有环境变量和本地变量
修改环境变量
PATH=xxx即可
不过此时我们会发现指令无法使用了,这是因为之前的那些路径被现在的覆盖了如果是想在原路径的基础上进行添加只需要先退出xshell(恢复到原本的PATH)再PATH=$PATH:xxx即可
我们修改了PATH这个环境变量,但是一关闭xshell,再开启,PATH的值就恢复成原来的样子了,我们对他的修改没有在关闭后保存。于是我们可以推测这些环境变量是存在于内存中的。就像我们c语言可以malloc一样,程序在启动时开辟一段内存空间,从父进程继承环境变量。父进程的环境变量则是由父进程的父进程传递来的。其最终源头,是一份系统配置文件,存储在硬盘中,掉电不丢失,当我们登录账号时,会启动shell进程,他会从该文件中读取相关信息并开辟空间进行存储,组成自己的环境变量表,而shell是所有进程的父进程,因此别的进程就可以从他这里继承环境变量了。在用户目录下,有两个隐藏文件。就是我们说的系统配置文件。
设置与取消环境变量
a=100
我们用echo查一下
本质是你的shell会把这个字符串记录下来,并为他开辟一片空间,于是echo查询的时候就会查到他,这种变量叫做本地变量,这种变量无法被子进程继承。
想要把本地变量转化为环境变量,只需要export+本地变量名,就可以了
也可以在定义时写为
export a=10
取消环境变量和本地变量unset 变量名
-------------很好,关于环境变量就算是讲完了,觉得有用的话,还请关注一下作者吧。-------------