发布时间:2024-05-25 08:01
echo $NAME //NAME:你的环境变量名称
2.对比./myproc执行和之间myproc执行
3. 为什么有些指令可以直接执行,不需要带路径,而我们的二进制程序需要带路径才能执行?
4. 将我们的程序所在路径加入环境变量PATH当中, export PATH=$PATH:myproc程序所在路径
每个程序都会收到一张环境表,环境表是一个字符指针数组,每个指针指向一个以’\\0’结尾的环境字符串.
通过代码如何获取环境变量
通过第三方变量environ获取(了解)
libc中定义的全局变量environ指向环境变量表,environ没有包含在任何头文件中,所以在使用时 要用extern声明。
通过系统调用获取或设置环境变量(重点掌握)
getenv , 本次讲解
setenv , 后面讲解
常用getenv和setenv函数来访问特定的环境变量。
验证一下:
注意:上面这个不是真的内存!!那么它是什么呢?它是进程虚拟地址空间。
下面验证一下:
我们发现,输出出来的变量值和地址是一模一样的,很好理解呀,因为子进程按照父进程为模版,父子并没有对变量进行进行任何修改。可是将代码稍加改动:
我们发现,父子进程,输出地址是一致的,但是变量内容不一样!能得出如下结论:
OS必须负责将 虚拟地址 转化成 物理地址 。
进程地址空间
所以之前说‘程序的地址空间’是不准确的,准确的应该说成 进程地址空间 ,那该如何理解呢?
上面的图就足矣说名问题,同一个变量,地址相同,其实是虚拟地址相同,内容不同其实是被映射到了不同的物理地址。
为什么要有地址空间:
1.通过添加一层软件层,完成有效的对进程操作内存进行风险管理(权限管理), 本质的目的是为了保护物理内存已经各个进程的数据安全。
2.将内存申请和内存使用的概念在时间上划分清楚,通过虚拟地址空间,来屏蔽底层申请内存的过程,达到进读写内存和OS进行内存管理操作,进行软件上面的分离。
3.站在CPU和应用层的角度,进程可以统一看做统一使用4GB的空间,而且每个空间区域的相对位置,是比较确定的!
补充:
这内核空间存的是什么呢?
上图是Linux2.6内核中进程队列的数据结构,之间关系也已经给大家画出来,方便大家理解
普通优先级: 100~ 139(我们都是普通的优先级,想想nice值的取值范围,可与之对应!)
实时优先级: 0~ 99(不关心)
活动队列:
过期队列