linux 系统编程 --cpu与指令的工作流程,MMU,环境变量(六)

单道程序设计:一段时间只有一个程序在运行。

多道程序设计:时钟中断是硬件基础,让多道程序设计的理论得以实现,多个程序轮流使用cpu(时间片),当下常见的cpu为纳秒级,而人眼的反应速度是毫秒级,所以看似在同时运行。

实质上,并发是宏观,微观依然是串行。

在这里插入图片描述

MMU在cpu内部,以page为单位,在32位机上,一个page就是4k。
它主要完成两个工作,其一是把虚拟内存映射到物理地址,其二是设置内存访问权限。

在这里插入图片描述
linux中访问级别是2种,1种是3级,1种是0级。
windows中访问级别是4种。

在程序开始运行后,MMU就开始起作用了,预取器阶段就是在虚拟内存空间里工作。

每个进程在内核中都有一个进程控制块(pcb)来维护进程相关信息,linux内核的进程控制块是task_struct结构体。
它位于/usr/src/linux-headers/include/linux/sched.h文件中,内部成员很多。
用grep -r “task_struct” 来查询该结构体。

环境变量: 为了多用户而创建的,指定操作系统运行环境的一些参数。它保存在进程的stack区。

①PATH 可执行文件的搜索路径,ls命令也是一个程序,执行它不需要提供完整的路径名,这个路径名就保存在PATH环境变量里。变量的值可以包含多个目录,互相用冒号隔开。
echo $PATH
在这里插入图片描述
查找顺序是从前往后,所以如果有新的同名程序放在前面的路径中,就会执行这个新的同名程序。
还有echo $SHELL ,echo $HOME ,echo $LANG ,echo $TERM等。
在这里插入图片描述
xterm表明是图形终端。
环境变量在程序中的使用和命令行参数很接近,存储是字符串的形式,以NULL结尾。
需要全局变量引入 extern char**environ;

 #include <stdio.h>
extern char**environ;

int main()
{
  int i;
  for (i=0;environ[i];i++)
  {
    printf("%s\n",environ[i]);
  }
  return 0;
}

执行结果:
在这里插入图片描述
在这里插入图片描述
相当多。
这个输出的环境变量表,是编写的该程序运行后进程的环境变量。

对环境变量操作的3个函数:getenv、setenv、unsetenv


 #include <stdio.h>
 #include <stdlib.h>

int main()
{
  printf("%s\n",getenv("SESSION"));
  return 0;
}

在这里插入图片描述
如果没有找到,getenv返回null(仍然是个字符串)
setenv 设置环境变量
int setenv(const char *name, const char *value, int overwrite);
第3个参数非零的话,说明要修改原有值或者添加新的环境变量。
unsetenv取消设置。

 #include <stdio.h>
 #include <stdlib.h>

int main()
{
  const char*name="SESSION";
  const char*value="ubuntu 16.04";
  setenv(name,value,1);
  printf("%s\n",getenv("SESSION"));
  return 0;
}

执行结果:
在这里插入图片描述
unsetenv没有那么智能,它仅仅是删除该环境变量,而不是“取消上次修改”

 #include <stdio.h>
 #include <stdlib.h>

int main()
{
  const char*name="SESSION";
  const char*value="ubuntu 16.04";
  setenv(name,value,1);
  unsetenv(name);
  printf("%s\n",getenv("SESSION"));
  return 0;
}

这样的话,执行结果会报错:
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值