1、命令行参数
1、(argc+argv)命令行参数,argc命令行参数个数,argv参数清单
2、指令的选项是通过命令行参数实现,选项的意义就是在同一个程序根据不同的选项为用户执行不同的服务
3、选项本质是字符串,首先被shell(命令行解释器)拿到,然后按照空格打印成一张表(argv),命令行启动的子进程,可以共享父进程的数据,例如:ls这样的命令作为子进程,可以拿到我们跟着的选项
2、环境变量
环境变量(environment variables)一般是指在操作系统中用来指定操作系统运行环境的一些参数
如:我们在编写C/C++代码的时候,在链接的时候,从来不知道我们的所链接的动态静态库在哪里,但是照样可以链接成功,生成可执行程序,原因就是有相关环境变量帮助编译器进行查找。
环境变量通常具有某些特殊用途,还有在系统当中通常具有全局特性
1、env数组:保存环境变量
2、env查看linux的环境变量
3、环境变量是内存级别的,更改后,重启shell就会恢复,无论正确与否
4、根据之前的学习我们可以知道命令其实就是一个可执行程序,但是为什么命令可以直接使用名字,而我们自己的程序需要添加./ (./当前路径)
原因是系统会默认在/user/bin/路径下查找,但是我们自己的命令在/user/bin/下不存在,所以我们可以通过将这个命令移到/user/bin/路径下,实现不带./ ,
5、为什么系统要在/user/bin/路径下找?
指令的查找本质上是shell帮我们做的,shell里包含着环境变量,这个环境变量默认这个路径
6、echo > $PATH :打印这个环境变量,会默认在这个路径集合下保存(系统可执行文件的搜索集合)
7、PATH=路径,更改环境变量路径(关闭系统会恢复)
8、PATH下的路径,是从哪里来的?环境变量一定都是在系统的配置文件中的!
9、在系统中的家目录下一定存在两个系统配置文件:.bashrc / .bash_profile,系统启动时会读取这两个配置文件
如果在.bash_profile 文件里增加的路径是永久保存的
永久更改环境变量
10、HOME环境变量
问题:我们是先进入家目录,才创建的环境变量,还是先有的环境变量,再创建家目录
11、bash创建子进程时,子进程的task_struct内的属性哪里来的?
从bash来的,cwd是继承bash的
12、SHELL(环境变量)
13、PWD(保存当前路径)
pwd原理:(getenv获取环境变量)
14、代码可以获得环境变量
、、
14、SHELL支持本地变量:直接在命令行定义的变量(shell内部自己维护)
将本地变量导成环境变量
15、本地变量不能被子进程继承,环境变量可以
16、环境变量具有全局属性
3、地址空间
1、这里可以看到一个现象,gval的地址没有发生改变,但是gavl的值父子之间发生变化。
也就是说我们在使用c语言这种偏底层的语言中获取到的地址并非真实的地址(虚拟地址/线性地址)
2、进程地址空间是什么?
(1)进程地址空间就是操作系统给每一个程序画的大饼,让每一个程序认为自己独占地址空间
(2)操作系统要管理地址空间(先描述在组织)需要创建一个struct来管理,本质上地址空间就是一个结构体,他并非独立存在,它在进程的task_strcut内,命名为struct mm_struct,
3、进程地址空间划分:本质上就是通过特定的int型的值,只需要确定起始地址终止地址就相当于确定了地址区域
4、地址本质上就是一个无符号整形,4g的内存就相当于有2^32个地址(即整形)
4、一个进程的地址空间由自己的struct mm_struct(虚拟地址),但总归这个程序的数据还是要存放于内存当中,所以操作系统引入页表,页表左边存放着虚拟地址,右半部分存放着物理地址,程序员对虚拟地址的操作会映射到物理地址
5、子进程也有地址空间,子进程直接继承父进程的页表,代码与数据,所以子进程也会直接映射父进程的物理地址,在不修改时物理地址也会共享,但一旦发生写入,操作系统会申请一个同样大小的物理空间,然后操作系统直接更改子进程页表里的物理地址,但虚拟地址不会发生变化(写时拷贝机制)
6、页表右半部分其实不光存放了真实的物理地址,其实还存放了rwx权限以及isexists
7、当地址空间是只读的,而程序员却执行了写入操作,操作系统就会报错,甚至直接给你杀掉这个进程,字符串常量不允许我们写入,就是这样的原理,编译器引入const来修饰
8、当一个进程创建时,一定是先创建内核数据结构,在加载代码和数据
9、isexists:指的是目标程序当前物理地址是否在内存中存在,这个标志位用于程序的分批操作,挂起等操作
10、可执行程序在编译时,各个区域的大小就已经确定了,从哪里来的?mm_struct
11、程序其实根本不存在堆区、栈区,而这两个区是函数被调用时,操作系统动态创建的
12、堆空间本质上不是物理地址,而是虚拟地址
13、虚拟地址存在的意义:
1、保护物理内存–(野指针–虚拟地址发生问题)
2、进程管理与内存管理解耦合
3、让进程以统一的视角看待物理内存-- 代码、数据可以加载到物理地址任意地址
14、为什么全局变量和字符常量具有全局属性,本质上是因为这些数据存于已初始化区和未初始化区,会随着进程存在而存在,全局变量的地址能够一直被大家看到