操作系统
操作系统是管理计算机硬件资源和软件资源的一款系统软件
标准C语言提供的库函数,例如fopen(打开文件),文件最终是由系统去打开,fopen在底层会调用 系统调用接口函数open
系统调用接口相当于操作系统对外的一个窗口,所有的操作由系统调用函数反馈到内核中
shell壳是一个程序,自动运行在终端窗口,将代码翻译解释给内核,linux的shell为bash
python为一个脚本语言,通过解释器翻译给内核,内核再来处理,速度慢
c通过gcc编译得到一个a.out,a.out为一个二进制可执行文件,能被计算机直接执行,速度快
环境变量
1.每个进程都有一张自己的环境变量表,表中的每个条目都是形如“键=值”形式的环境变量
进程:正在运行着的程序
编译得到可执行程序a.out,a.out本质是可执行二进制文件,不执行时为文件,./a.out则执行,执行的过程就叫进程
程序的执行离不开内核的管理,内核为每个进程维护一张环境变量表
键 = 值
2.进程可以通过环境变量访问计算机的资源
3.在终端下输入env命令,可以查看环境变量列表
看到的是该终端运行bash的环境变量
4.通过echo $name可以查看某个环境变量的值
环境变量的添加
1.在终端窗口输入FOOD=guobaorou,表示向当前进程中增加名为“FOOD”值为“guobaorou”的环境变量,如果环境变量已经存在,则更改其值
2.强调!在“=”左右不要加空格
环境变量的类别
1.环境变量分成两大类:
全局环境变量:当前shell和其子进程都是可见的(能够通过env命令查看到)
局部环境变量:只有当前shell可见(通过env命令看不到)
FOOD属于局部环境变量,通过env看不到
2.将局部环境变量设置成全局变量 export name
则通过env可查看到FOOD
3.删除环境变量 unset name
FOOD已被删除
给a.out添加环境变量如LOGPATH=,NAME=,环境变量用来记录进程中需要用到的数据,程序需要时去环境变量读取
常见环境变量
PATH环境变量
echo $PATH
该环境变量记录的是bash进程对命令的检索路径
格式为“:”分割的多个路径,当在bash下输入命令的时候,首先在第一个路径下找该命令的可持续程序,找到就执行,不再向后找;如果找不到,在第二个路径下找,找到就执行,不再向后找;如果找不到,继续下一个路径。如果到最后一个路径都找不到,就提示该命令不能找到的错误
ls,cd,rm命令和a.out本质没有区别,都是二进制可执行文件,在bin目录下
无论在哪个目录下敲ls命令都能执行bin下的ls文件
1.寻找时bash进程找自己的PATH环境变量,此时ls文件/程序还未执行,执行后内核才为ls维护ls的环境变量表
2.将自己写的可执行程序ls放在PATH中bin前的目录里。重启终端后执行ls时执行的是自己写的ls,先找到自己写的ls,检索停止。不重启则执行bin中的ls
3.ubuntu新版本会将命令执行位置记录到缓存中,不关闭则不能清除缓存。打开终端第一次执行ls会在PATH中检索,第二次执行缓存中的路径
此时bash在PATH中未找到a.out文件/程序/命令
./等于告诉bash在当前路径下寻找a.out文件
如果将a.out放在PATH环境变量中的任一路径下, bash能找到a.out,则直接敲a.out也可执行
或者将a.out的路径添加到PATH环境变量中,bash能找到a.out,则直接敲a.out也可执行
或者将.(当前路径)添加到PATH环境变量中
或者$PATH也代表原值,$PATH:.为新值
直接敲a.out可执行
此时重启终端窗口
此时终端窗口运行的bash与刚刚关闭终端串口的bash不是同一个进程
两次的bash进程都有独属的环境变量表,新的bash环境变量PATH没有:.路径,所以又找不到a.out
文件名前有. 则代表为隐藏文件
在.bashrc中添加环境变量修改
重启终端,a.out输入成功
环境变量表
每个进程都有这样一个以NULL指针结束的字符指针数组(环境变量表)
每个元素都是一个char类型指针(char*类型元素),指向一个字符串/记录一个字符串的地址,字符串的内容为环境变量
只要知道字符指针数组首地址/首元素地址(即记录环境变量字符串的地址的地址/指针的地址),就可以知道所有环境变量。该首地址/首元素地址保存在全局变量environ中,为char**类型
该全局变量environ声明在其他文件里,想要使用需要外部引入,加extern
循环输出每一个环境变量:
char** pp=environ:定义char** pp,将environ赋给pp,pp同样记录首元素地址
*pp:字符指针数组元素的值(即字符串的地址/数组内字符指针的值)
指向NULL则值为0,0为假,循环结束。NULL的本质为宏,值为0
%s要的就是字符串地址,从字符串首地址开始输出字符,遇到\0结束
pp++:pp指向每一个字符指针数组元素/记录每个元素的地址(即存储 字符串的地址 的地址/数组内字符指针的地址)
指针为存放地址的变量,指针就是地址,地址就是指针,指针的值也是地址,指针的地址也是地址(二级指针)
指针指向字符串/指针变量存储字符串的地址,解引用得到字符串(??得复习字符串指针部分。。。)
编译,运行当前目录下env.c,成功执行,内核为该进程维护一个环境变量表
通过environ拿到该进程环境变量表首元素地址/首地址
通过循环输出该进程每一个环境变量
argc为命令行参数个数,argv[]为命令行参数内容,char* envp[]为进程环境变量表起始地址
通过envp也能获得环境变量表首地址
2022.10.21