目录命令行参数与环境变量命令行参数vim下的main()环境变量环境变量的应用举例查询环境变量全部查询针对名称查询常用的方式环境变量的更改配置环境变量进程命令行参数及环境变量的关系结论获取环境变量①getenv();②environ();本地变量特性本地变量的删除本地变量-环境变量问题探讨内建命令库函数与系统调用重构了main()函数-参数、运行环境基于Linux进程深度下的吐血整理~~命令行参数与环境变量命令行参数一个命令可以通过 [选项] 来实现特定的功能。像ls -a 及ls -a -l类似于以前使用的main()函数中你可能见过的l两种形态int main(int argc, char *argv[]); int main(int argc, char **argv);main()作为程序的入口实际上我们也可以通过外部指定[选项]来传入并调用特定功能vim下的main()vim内int main(int argc, char *argv[]) { //…… return 0; }在bash# 执行命令 ./a.out -l -a hello world 123本质就是将-l -a hello world 123分别分割并传入argv[]argc5argv[0]./myprogram程序名argv[1]-largv[2]-aargv[3]helloargv[4]worldargv[5]123argv[6]NULL结束标志运行代码#include stdio.h int main(int argc, char *argv[]) { printf(参数个数: %d\n, argc); for (int i 0; i argc; i) { printf(argv[%d] %s\n, i, argv[i]); } return 0; }makefile内1 SRC$(wildcard *.c) 2 OBJ$(SRC:.c.o) 3 CCgcc -stdc99 4 LFLAGS-o 5 FLAGS-c 6 RMrm -f 7 all:$(OBJ) 8 $(CC) $^ $(LFLAGS) pc 9 %.o:%.c 10 $(CC) $(FLAGS) $ $(LFLAGS) $ 11 .PHONY: clean 12 clean: 13 $(RM) pc $(OBJ)运行环境变量☆功能环境变量是进程级[背景]配置。特性说明本质键值对(HOME/home/wzb)作用配置环境运行环境无需修改代码继承性子进程自动继承父进程的环境变量作用范围当前进程及其子进程因此环境变量具有全局特性可被所有进程继承。“进程级”配置又是一位程序新引入的执行逻辑大大增加代码的复杂度。就像C中引入条件语句一般是跨越性进步。环境变量的应用举例查询环境变量全部查询env会打印显示全部已配置环境变量格式为[环境变量名称][环境变量内容]针对名称查询常用的方式echo $[名称] #例如echo $PATH环境变量的更改①[原名称][新的绝对路径] #覆盖原路径②[原名称]$[原名称]:[拼接路径] #简便地路径拼接配置环境变量增加环境变量export [名称][内容]删除环境变量unset [名称]进程命令行参数及环境变量的关系无需多言我们在VS2022下运行#includestdio.h int main(int argc, char* argv[], char* envp[]) { // envp是环境变量数组格式为KEYval for (char** env envp; *env ! NULL; env) { printf(%s\n, *env); } return 0; }运行结果结果显而易见环境变量全部显现。结论因此自入进程开始我们就处于“命令行参数”“环境变量”的配置环境。图示如下获取环境变量①getenv();头文件stdlib.h函数原型char* getenv(const char* name);使用输入环境变量的名称来获取指向环境变量值的指针/NULL。 // 指向目录路径#include stdio.h #include stdlib.h int main() { char *path getenv(PATH); char *home getenv(HOME); printf(PATH: %s\n, path); printf(HOME: %s\n, home); return 0; }运行结果PATH: /usr/local/bin:/usr/bin:/bin HOME: /home/wzb②environ();头文件stdlib.h函数原型extern char** environ;二级指针型访问数据可使用下标直接访问代码实现输出同样的结果本地变量本地变量是定义于vim外bash内的变量。特性不会被子进程继承。定义时两侧不能加空格#否则会被当做命令进行查询 像:i10正确而i 10就是错误的本地变量的删除像环境变量一样unset [本地变量名]本地变量-环境变量export[本地变量名称]问题探讨内建命令众所周知Linux指令是bash进程下执行文件的子进程。假如export指令是一般性指令怎么做到的子进程指令处理内容到父进程呢实际上export别于一般性指令其本质是“内建命令”(build-in command)。其不需要创建子进程而是让bash自己操作。库函数与系统调用指令man的指定页查询1用户命令可执行程序ls,cd,grep,find2系统调用内核提供的接口read,write,open,fork3库函数C 标准库printf,malloc,strcpy库函数与系统调用的对比维度系统调用库函数运行空间内核态Kernel Mode用户态User Mode调用开销大需上下文切换小普通函数调用实现者操作系统内核语言库如 glibc或应用程序例子read()、write()、open()、fork()printf()、scanf()、fread()、strcpy()是否缓冲无缓冲直接操作内核通常有缓冲如 stdio 缓冲执行速度慢快博主吐血回顾重构整理 求关注o(╥﹏╥)o