命令行参数
main函数中一般有三个,但是在平时编码时一般会进行省略
int main(int argc,char* argv[],char* env[){}
参数的含义(针对前两个参数)
argc:用于保存命令行输入的字符串个数
argv:用于保存命令函数输入的字符串,末尾为NULL
//示例代码
#include<stdio.h> int main(int argc,char* argv[]){
int i = 0;
for(;i<argc;i++){
printf("argv[%d]:%s\n",i,argv[i]);
}
return 0;
}
执行结果
为什么要有命令行参数呢?
命令行参数可以通过输入的不同选项,执行不同的行为
//示例代码
#include<stdio.h>
#include<string.h>
int main(int argc,char* argv[]){
int index = 1;
if(strcmp(argv[index],"a")==0){
printf("the command is -a\n");
}
if(strcmp(argv[index],"-l")==0){
printf("the command is -l\n");
}
return 0;
}
执行结果
环境变量
引入:在linux中一切皆文件,像ls、mkdir等指令也是文件,那么为什么执行他们的时候不用指定路径,而执行我们自己的程序时需要指定路径呢?我们自己的程序可不可以省略路径直接执行呢?
答案是可以的,通过对环境变量的配置告诉命令行解释器,应该去哪里找可执行程序
查看环境变量的内容
查看指定环境变量
ehco $环境变量名
ehco $PATH
echo $PWD
echo $HOME
....
查看环境变量列表
env
将我们自己的程序添加到PATH环境变量中
//添加程序路径至环境变量
PATH:$PATH:/home/learn/code
当我们重新启动linux时,我们自己的程序又需要指定路径了,这是因为环境变量是内存级的,linux启动时,系统中的配置都会被加载到bash进程中 (内存)。
那为什么ls、cd等指令重启Linux后还是可以继续执行呢?这是因为这些指令提前被配置好了,保存在了配置文件中。
bash_profile文件
创建新的环境变量
创建环境变量
export envName=val
取消环境变量
unset envName
代码中的环境变量操作
通过命令行参数env获取
#include<stdio.h>
#include<string.h>
int main(int argc,char* argv[],char* env[]){
int i = 0;
for(;i<10;i++){
printf("env[%d]:%s\n",i,env[i]);
}
return 0;
}
通过environ获取
#include<stdio.h>
#include<string.h>
int main(){
extern char** environ;
int i =0;
for(;i<10;i++){
printf("env[%d]:%s\n",i,environ[i]);
}
return 0;
}
内建命令
内建命令指的是由bash亲自执行而非bash创建子进程去执行的命令,常见的有:pwd、export、echo等。
父进程是如何将非内建命令交给子进程去执行的呢?
在bash进程启动时,会给子进程维护两张表,分别是argv命令行参数表和env环境变量表(environ指针也是指向env表的),通过argv表将命令交付给子进程,再通过env表找到命令所在路径,从而通过子进程完成命令的执行。
综上我们得出一个结论,环境变量是具有全局性的,父进程的环境变量可以被子进程继承。