Unix C学习笔记1 操作系统简介,环境变量,环境变量表

操作系统

操作系统是管理计算机硬件资源和软件资源的一款系统软件

标准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

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值